[
  {
    "path": "Arrays/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "Arrays/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n\tz-index: 10;\n}\n\n#particleCanvas {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n}\n\n"
  },
  {
    "path": "Arrays/data_structures/linked_list.js",
    "content": "function Cell(prev, next, value) {\n  this.prev = prev;\n  this.next = next;\n  this.value = value;\n}\n\nfunction List(head, tail) {\n  this.head = head;\n  this.tail = tail;\n}\n\nexports.create = function() {\n  return new List(null, null);\n}\n\nexports.append = function(list, value) {\n  var ncell = new Cell(list.tail, null, value);\n  if(!list.head) {\n    list.head       = ncell;\n    list.tail       = ncell;\n  } else {\n    list.tail.next  = ncell;\n    list.tail       = ncell;\n  }\n}\n\nexports.insert = function(list, iter, value) {\n  if(iter === null) {\n    exports.append(list, value);\n    return;  \n  }\n  var ncell = new Cell(iter.prev, iter, value);\n  iter.prev = ncell;\n  if(iter.prev) {\n    iter.prev.next = ncell;\n  } else {\n    list.head = ncell;\n  }\n}\n\nexports.remove = function(list, iter) {\n  if(iter.prev) {\n    iter.prev.next = iter.next;\n  } else {\n    list.head = iter.next;\n  } \n  if(iter.next) {\n    iter.next.prev = iter.prev;\n  } else {\n    list.tail = iter.prev;\n  }\n}\n\nexports.read = function(list, iter) {\n  return iter.value;\n}\n\nexports.begin = function(list) {\n  return list.head;\n}\n\nexports.next = function(list, iter) {\n  return iter.next;\n}\n\nexports.prev = function(list, iter) {\n  return iter.prev;\n}\n\nexports.end = function(list) {\n  return null;\n}\n\n"
  },
  {
    "path": "Arrays/data_structures/ordered_array.js",
    "content": "exports.create = function() {\n  return [];\n}\n\nexports.insert = function(array, iter, value) {\n  array.splice(iter, 0, value);\n}\n\nexports.remove = function(array, iter) {\n  array.splice(iter, 1);\n}\n\nexports.append = function(array, value) {\n  array.push(value);\n}\n\nexports.read = function(array, iter) {\n  return array[iter];\n}\n\nexports.begin = function(array) {\n  return array.length-1;\n}\n\nexports.prev = function(array, iter) {\n  return iter + 1;\n}\n\nexports.next = function(array, iter) {\n  return iter - 1;\n}\n\nexports.end = function(array) {\n  return -1;\n}\n"
  },
  {
    "path": "Arrays/data_structures/unordered_array.js",
    "content": "exports.create = function() {\n  return [];\n}\n\nexports.insert = function(array, iter, value) {\n  //Not supported  \n  throw new Error(\"Unsupported operation\");\n}\n\nexports.remove = function(array, iter) {\n  array[iter] = array[array.length - 1];\n  array.pop();\n}\n\nexports.append = function(array, value) {\n  array.push(value);\n}\n\nexports.read = function(array, iter) {\n  return array[iter];\n}\n\nexports.begin = function(array) {\n  return array.length - 1;\n}\n\nexports.prev = function(array, iter) {\n  //Not supported  \n  throw new Error(\"Unsupported operation\");\n}\n\nexports.next = function(array, iter) {\n  return iter - 1;\n}\n\nexports.end = function(array) {\n  return -1;\n}\n\n"
  },
  {
    "path": "Arrays/particles.html",
    "content": "<html>\n  <head>\n    <title>Particle Test</title>\n    <script src=\"require.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" />\n  </head>\n  <body>\n    <div id=\"info\">\n      <p>\n        <label> Data Structure: </label>\n        <select id=\"dataStructure\"></select>\n      </p>\n      <p>\n        <label> Spawn Rate: </label>\n        <input type=\"range\" id=\"spawnRate\" min=\"0\" max=\"100\" step=\"0.1\" value=\"1.0\" />\n      </p>\n      <p>\n        <label> Particle Count: </label>\n        <input type=\"text\" id=\"particleCount\" />\n      </p>\n      <p>\n        <label> Average Frame Time (ms): </label>\n        <input type=\"text\" id=\"frameTime\" />\n      </p>\n    \n    </div>\n  \n    <canvas id=\"particleCanvas\" ></canvas>\n    \n    <script>\n\n// shim layer with setTimeout fallback\nwindow.requestAnimFrame = (function(){\n  return  window.requestAnimationFrame       || \n          window.webkitRequestAnimationFrame || \n          window.mozRequestAnimationFrame    || \n          window.oRequestAnimationFrame      || \n          window.msRequestAnimationFrame     || \n          function( callback ){\n            window.setTimeout(callback, 1000 / 60);\n          };\n})();\n\n(function() {\n  \"use strict\";\n  \n  var particles = require('./test_cases/particles.js')\n    , unordered_array = require('./data_structures/unordered_array.js')\n    , ordered_array = require('./data_structures/ordered_array.js')\n    , linked_list = require('./data_structures/linked_list.js');\n  \n  //Initialize data structures\n  var data_structures = {\n      'Ordered Array':    ordered_array\n    , 'Linked List':      linked_list\n    , 'Unordered Array':  unordered_array\n  };\n\n  //Initialize option list\n  for(var id in data_structures) {\n    document.getElementById(\"dataStructure\").add(new Option(id, id));\n  }\n\n  var simulation\n    , data_structure;\n  function resetParticles() {\n    data_structure = data_structures[document.getElementById(\"dataStructure\").value];\n    simulation = particles.create_particle_system({\n          data_structure: data_structure\n        , emitter_rate: 1.0 * document.getElementById(\"spawnRate\").value\n    });\n  }\n  \n  document.getElementById(\"dataStructure\").addEventListener(\"change\", resetParticles, false);\n  resetParticles();\n  \n  document.getElementById(\"spawnRate\").addEventListener(\"change\", function() {\n    simulation.emitter_rate = 1.0 * document.getElementById(\"spawnRate\").value;\n  }, false);\n  \n  //Tick every 15 ms\n  var avg_frame_time = 10;\n  setInterval(function() {\n    var start = new Date();\n    simulation.tick();\n    var end = new Date();\n    avg_frame_time = 0.7 * avg_frame_time + 0.3 * (end - start);\n  }, 15);\n  \n\n  //Retrieve context\n  var canvas  = document.getElementById(\"particleCanvas\")\n    , context = canvas.getContext(\"2d\");\n  \n  //Resize event handler\n  function resize() {\n    canvas.width  = window.innerWidth;\n    canvas.height = window.innerHeight;\n  }\n  window.addEventListener(\"resize\", resize, false);\n  resize();\n  \n  //Render event handler\n  function render() {\n  \n    context.clearRect(0, 0, canvas.width, canvas.height);\n    \n    var sx = canvas.width / 20.0\n      , sy = canvas.height / 20.0;\n    var count = 0;\n    for(var iter = data_structure.begin(simulation.particles);\n        iter !== data_structure.end(simulation.particles);\n        iter = data_structure.next(simulation.particles, iter)) {\n     \n      var particle = data_structure.read(simulation.particles, iter)\n        , intensity = Math.floor(255.0 * particle.color);\n      context.fillStyle = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')';\n      context.fillRect(sx*(particle.x+10.0)-3, sy*(particle.y+10.0)-3, 6, 6);\n      ++count;\n    }\n  \n    document.getElementById(\"frameTime\").value = Math.round(1000*avg_frame_time)/1000.0;\n    document.getElementById(\"particleCount\").value = count;\n\n    window.requestAnimFrame(render);\n  }\n  render();  \n           \n})();\n    \n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "Arrays/require.js",
    "content": "// ==Closure.compiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n// ==/Closure.compiler==\n\n// Require() 0.3.2 unstable\n//\n// Copyright 2012 Torben Schulz <http://pixelsvsbytes.com/>\n// \n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n// \n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n// \n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n// \n///////////////////////////////////////////////////////////////////////\n\n(function() {\n'use strict';\n\nif (window.require !== undefined)\n\tthrow 'RequireException: \\'require\\' already defined in global scope';\n\nwindow.require = function(module, callback) {\n\tvar url = window.require.resolve(module);\n\n\tif (require.cache[url]) {\n\t\t// NOTE The callback should always be called asynchronously\n\t\tcallback && setTimeout(callback, 0);\n\t\treturn require.cache[url];\n\t}\n\n\trequire.cache[url] = new Object();\n\n\tvar request = new XMLHttpRequest();\n\trequest.onreadystatechange = function() {\n\t\tif (request.readyState != 4)\n\t\t\treturn;\n\t\tif (request.status != 200)\n\t\t\tthrow 'RequireException: '+request.status+' '+request.statustext+' ('+url+')';\n\n\t\tif (request.getResponseHeader('content-type').indexOf('application/json') != -1) \n\t\t\twindow.require.cache[url] = JSON.parse(request.responseText);\n\t\telse \n\t\t\teval('(function(){'+(window.require.strict?'\\'use strict\\';':'')+'var exports=window.require.cache[\\''+url+'\\'];'+request.responseText+'\\n})();\\n//@ sourceURL='+url);\n\n\t\tcallback && callback();\n\t}\n\n\trequest.open('GET', url, !!callback);\n\trequest.send();\n\treturn require.cache[url];\n}\nwindow.require.resolve = function(module) {\n\tvar r = module.match(/^(\\.{0,2}\\/)?([^\\.]*)(\\..*)?$/);\n\treturn (r[1]?r[1]:'/js_modules/')+r[2]+(r[3]?r[3]:'/index.js');\n}\n// INFO initializing module cache\nwindow.require.cache = new Object();\n// INFO initializing strict mode toggle\nwindow.require.strict = false;\n\n})();\n"
  },
  {
    "path": "Arrays/test_cases/particles.js",
    "content": "\nfunction Particle() {\n  this.x = 0.0;\n  this.y = 0.0;  \n  var t = Math.random() * Math.PI * 2.0\n    , r = Math.random() * 0.1;\n  this.vx = Math.cos(t) * r;\n  this.vy = Math.sin(t) * r;\n  this.color = Math.random();\n}\n\nexports.create_particle_system = function(options) {\n  var Seq = options.data_structure\n    , particles = Seq.create()\n    , accumulator = 0.0;\n  \n  return {\n      particles: particles\n    , emitter_rate: options.emitter_rate\n    , tick: function() {\n      accumulator += Math.random() * this.emitter_rate * 2.0;\n      while(accumulator > 1) {\n        Seq.append(particles, new Particle());\n        accumulator -= 1.0;\n      }\n      for(var iter = Seq.begin(particles); iter!== Seq.end(particles); iter = Seq.next(particles, iter)) {\n        var particle = Seq.read(particles, iter);\n        particle.x += particle.vx;\n        particle.y += particle.vy;\n        if(Math.abs(particle.x) > 10.0 || Math.abs(particle.y) > 10.0) {\n          Seq.remove(particles, iter);\n        }\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "Arrays/test_cases/test_construct.js",
    "content": "var Seq = require(process.argv[2]);\n\n//Create initial data structure\nfor(var i=5; i<23; ++i) {\n  var n = (1<<i)\n    , d = Seq.create();\n  \n  console.log(\"Running test, n=\", n);\n  \n  //Fill in data structure\n  var start = (new Date());\n  for(var j=0; j<n; ++j) {\n    Seq.append(d, Math.random());\n  }\n  var end = (new Date());\n  console.log( \"Create time: \", (end - start) / 1000.0 );\n  \n  //Walk over the array a couple of times\n  start = new Date();\n  for(var j=0; j<10; ++j) {\n    var s = 0;\n    for(var iter = Seq.begin(d); iter !== Seq.end(d); iter = Seq.next(d, iter)) {\n      s += Seq.read(d, iter);\n    }\n  }\n  end = new Date();\n  console.log( \"Iter. time: \", (end - start) / 10000.0 );\n}\n\n"
  },
  {
    "path": "Arrays/test_cases/test_particles.js",
    "content": "var particles = require('./particles.js').create_particle_system({\n    data_structure: require(process.argv[2]).create\n  , emitter_rate:   2.0\n}); \n\n\n//Warm up\nconsole.log(\"Warming up...\");\nfor(var i=0; i<10000; ++i) {\n  particles.tick();\n}\nconsole.log(\"Running benchmark\");\n\n//Do simulation\nvar NUM_ITERS = 1000000;\nvar start = new Date();\nfor(var i=0; i<NUM_ITERS; ++i) {\n  particles.tick();\n}\nvar end = new Date();\nconsole.log(\"Average time per tick = \", (end-start) / (NUM_ITERS * 1000.0), \"s\");\n\n"
  },
  {
    "path": "DataStructures/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "DataStructures/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n\tz-index: 10;\n}\n\n#particleCanvas {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n}\n\n"
  },
  {
    "path": "DataStructures/index.html",
    "content": "<html>\n  <head>\n    <title>Particle Test</title>\n    <script src=\"require.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" />\n  </head>\n  <body>\n    <div id=\"info\">\n      <p>\n        <label> Data Structure: </label>\n        <select id=\"dataStructure\"></select>\n      </p>\n      <p>\n        <label> Spawn Rate: </label>\n        <input type=\"range\" id=\"spawnRate\" min=\"0\" max=\"100\" step=\"0.1\" value=\"1.0\" />\n      </p>\n      <p>\n        <label> Particle Count: </label>\n        <input type=\"text\" id=\"particleCount\" />\n      </p>\n      <p>\n        <label> Average Frame Time (ms): </label>\n        <input type=\"text\" id=\"frameTime\" />\n      </p>\n    \n    </div>\n  \n    <canvas id=\"particleCanvas\" ></canvas>\n    \n    <script>\n\n// shim layer with setTimeout fallback\nwindow.requestAnimFrame = (function(){\n  return  window.requestAnimationFrame       || \n          window.webkitRequestAnimationFrame || \n          window.mozRequestAnimationFrame    || \n          window.oRequestAnimationFrame      || \n          window.msRequestAnimationFrame     || \n          function( callback ){\n            window.setTimeout(callback, 1000 / 60);\n          };\n})();\n\n(function() {\n  \"use strict\";\n  \n  var particles = require('./tests/particles.js')\n    , vector    = require('./structures/vector.js')\n    , list      = require('./structures/list.js')\n    , unordered_vector = require('./structures/unordered_vector.js');\n  \n  //Initialize data structures\n  var data_structures = {\n      'Vector':     vector.create\n    , 'List':       list.create\n    , 'Unordered Vector': unordered_vector.create\n  };\n\n  //Initialize option list\n  for(var id in data_structures) {\n    document.getElementById(\"dataStructure\").add(new Option(id, id));\n  }\n\n  var simulation\n    , data_structure;\n  function resetParticles() {\n    data_structure = data_structures[document.getElementById(\"dataStructure\").value];\n    simulation = particles.create_particle_system({\n          data_structure: data_structure\n        , emitter_rate: 1.0 * document.getElementById(\"spawnRate\").value\n    });\n  }\n  \n  document.getElementById(\"dataStructure\").addEventListener(\"change\", resetParticles, false);\n  resetParticles();\n  \n  document.getElementById(\"spawnRate\").addEventListener(\"change\", function() {\n    simulation.emitter_rate = 1.0 * document.getElementById(\"spawnRate\").value;\n  }, false);\n  \n  //Tick every 15 ms\n  var avg_frame_time = 10;\n  setInterval(function() {\n    var start = new Date();\n    simulation.tick();\n    var end = new Date();\n    avg_frame_time = 0.7 * avg_frame_time + 0.3 * (end - start);\n  }, 15);\n  \n\n  //Retrieve context\n  var canvas  = document.getElementById(\"particleCanvas\")\n    , context = canvas.getContext(\"2d\");\n  \n  //Resize event handler\n  function resize() {\n    canvas.width  = window.innerWidth;\n    canvas.height = window.innerHeight;\n  }\n  window.addEventListener(\"resize\", resize, false);\n  resize();\n  \n  //Render event handler\n  function render() {\n    context.clearRect(0, 0, canvas.width, canvas.height);\n    \n    var sx = canvas.width / 20.0\n      , sy = canvas.height / 20.0;\n    var count = 0;\n    \n    simulation.foreachParticle(function(x, y, vx, vy, color) {\n      ++count;\n      var intensity = Math.floor(255.0 * color);\n      context.fillStyle = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')';\n      context.fillRect(sx*(x+10.0)-3, sy*(y+10.0)-3, 6, 6);\n    });\n  \n    document.getElementById(\"frameTime\").value = Math.round(1000*avg_frame_time)/1000.0;\n    document.getElementById(\"particleCount\").value = count;\n\n    window.requestAnimFrame(render);\n  }\n  render();  \n           \n})();\n    \n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "DataStructures/require.js",
    "content": "// ==Closure.compiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n// ==/Closure.compiler==\n\n// Require() 0.3.2 unstable\n//\n// Copyright 2012 Torben Schulz <http://pixelsvsbytes.com/>\n// \n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n// \n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n// \n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n// \n///////////////////////////////////////////////////////////////////////\n\n(function() {\n'use strict';\n\nif (window.require !== undefined)\n\tthrow 'RequireException: \\'require\\' already defined in global scope';\n\nwindow.require = function(module, callback, base_url) {\n\n  base_url = base_url || \"\";\n  \n  //Munge tokens\n  var toks = module.split(\"/\");\n  if(toks[0] == '.') {\n    toks = base_url.split('/').concat(toks.slice(1));\n  }\n  for(var i=0; i<toks.length; ++i) {\n    if(toks[i] == \"..\" && i > 0) {\n      toks.splice(i-1, 2);\n      i -= 2;\n    } else if(toks[i] == \".\" || toks[i].length === 0) {\n      toks.splice(i, 1);\n      i -= 1;\n    }\n  }\n  \n  var dirname = toks.slice(0,toks.length-1).join(\"/\")\n    , url = toks.join(\"/\");\n  \n\tif (require.cache[url]) {\n\t\t// NOTE The callback should always be called asynchronously\n\t\tvar obj = require.cache[url];\n\t\tif(obj.loaded) {\n\t\t  callback && setTimeout(function(){callback(obj.exports);}, 0);\n\t\t  return obj.exports;\n\t\t} else if(callback) {\n\t\t  obj.listeners.push(callback);\n\t\t  return obj.exports;\n\t\t}\n\t} else {\n\t  window.require.cache[url] = {\n\t      loaded: false\n\t    , listeners: []\n\t    , exports: new Object()\n\t  };\n  }\n  \n  \n\tvar request = new XMLHttpRequest();\n\trequest.onreadystatechange = function() {\n\t\n\t  var obj = window.require.cache[url];\n\t  if(obj.loaded) {\n\t    return;\n\t  }\n\t\n\t\tif (request.readyState != 4)\n\t\t\treturn;\n\t\tif (request.status != 200)\n\t\t\tthrow 'RequireException: '+request.status+' '+request.statustext+' ('+url+')';\n\n\t\tif (request.getResponseHeader('content-type').indexOf('application/json') != -1) \n\t\t\twindow.require.cache[url] = JSON.parse(request.responseText);\n\t\telse \n\t\t\teval('(function(){\\'use strict\\';\\nvar exports=window.require.cache[\\''+url+'\\'].exports;\\nvar __DIRNAME=\"'+dirname+'\";\\nvar require=function(module,cb){return window.require(module,cb,\"'+dirname+'\");};\\n'+request.responseText+'\\n})();\\n//@ sourceURL='+url);\n\n    //Set loaded flag\n    obj.loaded = true;\n    \n    //Wake up all listeners\n    var listeners = obj.listeners;\n    for(var i=0; i<listeners.length; ++i) {\n      listeners[i](obj.exports);\n    }\n\t}\n\t\n\tif(callback) {\n\t  window.require.cache[url].listeners.push(callback);\n  }\n\n\trequest.open('GET', url, !!callback);\n\trequest.send();\n\treturn require.cache[url].exports;\n}\n\n// INFO initializing module cache\nwindow.require.cache = new Object();\n\n})();\n"
  },
  {
    "path": "DataStructures/structures/list.js",
    "content": "exports.create = function(ArrayType, item_size) {\n\n  function Cell(next, prev, value) {\n    this.next   = next;\n    this.prev   = prev;\n    this.value  = value;\n  }\n\n  var head  = null\n    , tail  = null\n    , count = 0;\n    \n  //Create the data structure\n  var list = {\n  \n    //Iterator functions\n      begin: function() {\n      return head;\n    }\n    , end: function() {\n      return null;\n    }\n    , buffer: function(iter) {\n      return iter.value;\n    }\n    , index: function(iter) {\n      return 0;\n    }\n    , next: function(iter) {\n      return iter.next;\n    }\n    , prev: function(iter) {\n      if(iter)\n        return iter.prev;\n      return tail;\n    }\n    , valid: function(iter) {\n      return !!iter;\n    }\n    \n    //Iterator modification stuff\n    , insert: function(iter, value) {\n      ++count;\n      \n      //Special case: At end of list\n      if(!iter) {\n        var ncell = new Cell(null, tail, value);\n        if(tail) {\n          tail.next = ncell;\n        } else {\n          head = ncell;\n        }\n        tail = ncell;\n        return;\n      }\n      //Otherwise, just insert normally\n      var ncell = new Cell(iter, iter.prev, value);\n      if(iter.prev) {\n        iter.prev.next = ncell;\n      } else {\n        head = ncell;\n      }\n      iter.prev = ncell;\n    }\n    , remove: function(iter) {\n      --count;\n      if(iter.prev) {\n        iter.prev.next = iter.next;\n      } else {\n        head = iter.next;\n      }\n      if(iter.next) {\n        iter.next.prev = iter.prev;\n      } else {\n        tail = iter.prev;\n      }\n    }\n    \n    \n    //Updates\n    , push: function(value) {\n      list.insert(list.end(), value);\n    }\n    , pop: function() {\n      list.remove(list.prev(list.end()));\n    }\n    , unshift: function(value) {\n      list.insert(list.begin(), value);\n    }\n    , shift: function() {\n      list.remove(list.begin());\n    }\n    \n    //Status stuff\n    , count: function() {\n      return count;\n    } \n  };\n  \n  return list;\n}\n"
  },
  {
    "path": "DataStructures/structures/pma.js",
    "content": "//Packed memory array\n//\n// Supports fast iteration like vector, but O(log^2(n)) insert/delete like linked list\n//\nexports.makePMA = function(ArrayType, item_size) {\n\n  var levels      = 1\n    , chunk_size  = levels * item_size\n    , buffer      = new ArrayType( chunk_size << (levels+1) )\n    , occupancy   = new UInt8Array( 1<<(levels+1) )\n    , item_count  = 0; \n    \n  //Reallocate the data structure\n  function set_levels(nlevels) {\n  \n    var nchunk_size = nlevels * item_size\n      , nbuffer     = new ArrayType(chunk_size << (nlevels+1))\n      , noccupancy  = new UInt8Array(1<<(nlevels+1));\n    \n    //Rebalance array into new buffer, swap pointers\n    \n  \n  }\n    \n  //Rebalance all the elements in range\n  function rebalance(lo, hi) {\n  \n  }\n  \n  return {\n    //Basic iterator stuff\n      begin: function() {\n    }\n    , end: function() {\n    }\n    , value: function(iter) {\n    }\n    , next: function(iter) {\n    }\n    , prev: function(iter) {\n    }\n    , valid: function(iter) {\n    }\n\n    //Iterator modification stuff\n    , insert: function(iter, value) {\n    }\n    , remove: function(iter) {\n    }\n\n    //Updates\n    , push: function(value) {\n    }\n    , pop: function() {\n    }\n    , unshift: function(value) {\n    }\n    , shift: function() {\n    }\n    \n    //Status flags\n    , count: function() {\n    }\n  };\n}\n\n"
  },
  {
    "path": "DataStructures/structures/unordered_vector.js",
    "content": "var vector = require('./vector.js');\n\nexports.create = function(ArrayType, item_size) {\n  var vec = vector.create(ArrayType, item_size);\n  \n  vec.remove = function(iter) {\n    var buf = vec.buffer(iter)\n      , eob = vec.end() - item_size;\n    for(var i=0; i<item_size; ++i) {\n      buf[iter+i] = buf[eob+i];\n    }\n    vec.pop();\n  }\n\n  return vec;\n}\n\n\n"
  },
  {
    "path": "DataStructures/structures/vector.js",
    "content": "//A flat array of fixed size items stored in a packed type array.\n//\n// Basically this class is a workaround for the lack of packed struct support in javascript\n//\nexports.create = function(ArrayType, item_size) {\n\n  var buffer_size = 0\n    , buffer = new ArrayType(item_size, Math.ceil(4096 / item_size));\n  \n  //Reserves some space  \n  function check_resize() {\n    if(buffer_size + item_size <= buffer.length) {\n      return;\n    }\n    var tmp = new ArrayType(2*buffer.length);\n    tmp.set(buffer);\n    buffer = tmp;\n  }\n  \n  return {\n    //Basic iterator stuff\n      begin: function() {\n      return 0;\n    }\n    , end: function() {\n      return buffer_size;\n    }\n    , buffer: function(iter) {\n      return buffer;\n    }\n    , index: function(iter) {\n      return iter;\n    }\n    , next: function(iter) {\n      return iter + item_size;\n    }\n    , prev: function(iter) {\n      return iter - item_size;\n    }\n    , valid: function(iter) {\n      return 0 <= iter && iter < buffer_size;\n    }\n\n    //Iterator modification stuff\n    , insert: function(iter, value) {\n      check_resize();\n      buffer.set(buffer.subarray(iter, buffer_size), iter+item_size);\n      buffer.set(value, iter);\n      buffer_size += item_size;\n    }\n    , remove: function(iter) {\n      buffer.set(buffer.subarray(iter+item_size, buffer_size), iter);\n      buffer_size -= item_size;\n    }\n\n    //Updates\n    , push: function(value) {\n      check_resize();\n      buffer.set(value, buffer_size);\n      buffer_size += item_size;\n    }\n    , pop: function() {\n      buffer_size -= item_size;\n    }\n    , unshift: function(value) {\n      check_resize();\n      buffer.set(buffer.subarray(item_size, buffer_size), item_size);\n      buffer.set(value);\n      buffer_size += item_size;\n    }\n    , shift: function() {\n      buffer.set(buffer.subarray(item_size, buffer_size));\n      buffer_size -= item_size;\n    }\n    \n    //Status flags\n    , count: function() {\n      return buffer_size / item_size;\n    }\n    , item_size: function() {\n      return item_size;\n    }\n  };\n}\n\n"
  },
  {
    "path": "DataStructures/tests/particles.js",
    "content": "exports.create_particle_system = function(options) {\n  var particles   = options.data_structure(Float32Array, 5)\n    , accumulator = 0.0;\n  return {\n      emitter_rate: options.emitter_rate\n    , tick: function() {\n      accumulator += Math.random() * this.emitter_rate * 2.0;\n      while(accumulator >= 1.0) {\n        var t = Math.random() * Math.PI * 2.0\n          , v = Math.random() * 0.1 + 0.01;\n        particles.push(new Float32Array([\n            0.0, 0.0\n          , Math.cos(t) * v, Math.sin(t) * v\n          , Math.random()\n        ]));\n        accumulator -= 1.0;\n      }\n      \n      for(var iter = particles.prev(particles.end());\n        particles.valid(iter);\n        iter = particles.prev(iter)) {\n        var buf = particles.buffer(iter)\n          , idx = particles.index(iter);\n        buf[idx+0] += buf[idx+2];\n        buf[idx+1] += buf[idx+3];\n        if(Math.abs(buf[idx]) > 10.0 || Math.abs(buf[idx+1]) > 10.0) {\n          particles.remove(iter);\n        }\n      }\n    }\n    , foreachParticle: function(visitor) {\n      for(var iter = particles.begin(); iter !== particles.end(); iter = particles.next(iter)) {\n        var buf = particles.buffer(iter)\n          , idx = particles.index(iter);\n        visitor(buf[idx+0], buf[idx+1], buf[idx+2], buf[idx+3], buf[idx+4]);\n      }\n    }\n    , count : function() {\n      return particles.count();\n    }\n  }\n}\n\n"
  },
  {
    "path": "DataStructures/tests/test_particles.js",
    "content": "var particles = require('./particles.js').create_particle_system({\n    data_structure: require(process.argv[2]).create\n  , emitter_rate:   200.0\n}); \n\n//Warm up\nconsole.log(\"Warming up...\");\nfor(var i=0; i<2000; ++i) {\n  particles.tick();\n}\nconsole.log(\"Initial population:\", particles.count());\n\n//Do simulation\nconsole.log(\"Running benchmark\");\nvar NUM_ITERS = 10000;\nvar start = new Date();\nfor(var i=0; i<NUM_ITERS; ++i) {\n  particles.tick();\n}\nvar end = new Date();\nconsole.log(\"Final population:\", particles.count());\nconsole.log(\"Score = \", (end-start) / (NUM_ITERS * 1000.0), \"s / tick\");\n\n"
  },
  {
    "path": "Downsample/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Downsample/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "Downsample/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "Downsample/experiment.txt",
    "content": "\nMethod:  tested each algorithm on 65^3 grid.  Plotted the function\n\n  sin(omega * x) + sin(omega * y) + sin(omega * z)\n\nin the range [-pi/2, pi/2] x [-pi/2, pi/2] x [-pi/2, pi/2]\n\nTo control for garbage collection and other unpredictable run time events, each run was repeated 100x to get an averaged measurement.\n\nAlso, since v8 has a JIT, we ran each method on a grid initialized with omega = 5 for 100 iterations in an attempt to trigger v8's optimizer.\n\nMeasurements were taken on my laptop:\n\n  node.js version: 0.6.14\n  Linux Mint 12\n  CPU: Intel Core2 Duo P8700 @ 2.53GHz\n  RAM: 4 GB\n\nFirst column is omega, second column is time taken.  All measurements are in milliseconds (ms)\n\nmc:\n\n0, 29.93\n1, 43.62\n2, 61.48\n3, 93.31\n4, 138.2\n5, 145.8\n6, 186.0\n7, 213.2\n8, 255.9\n9, 272.1\n10, 274.6\n\n\n\n\nsn (no precalc):\n\n0, 26.79\n1, 33.95\n2, 44.87\n3, 54.74\n4, 59.81\n5, 86.61\n6, 98.45\n7, 114.5\n8, 131.2\n9, 131.0\n10, 147.7\n\n\n\n\n\nsn (w/ edge precalculation):\n\n0, 24.06\n1, 29.42\n2, 37.78\n3, 47.72\n4, 51.36\n5, 74.54\n6, 83.99\n7, 97.34\n8, 112.4\n9, 109.2\n10, 124.3\n\n\n\nmt (NOTE: Number of iterations was reduced to 20 in order to get benchmark to complete in a reasonable time):\n\n0, 57\n1, 171\n2, 250\n3, 392\n4, 510\n5, 620\n6, 784\n7, 922\n8, 1070\n9, 1220\n10, 1420\n\n\n\n\n\n\nMesh sizes:\n\nvertices/faces:\n\n\nsn:\n\n0, 0\n7759, 7569\n15261, 14513\n23247, 22695\n30590, 29132\n38627, 37749\n45957, 43861\n53899, 52755\n60978, 58304\n68991, 67665\n76193, 73133\n\n\n\nmc:\n\n0, 0\n31038, 15520\n61034, 30512\n93042, 46548\n122378, 61204\n154758, 77504\n184138, 92224\n216282, 108484\n244514, 122576\n277422, 139440\n306554, 154168\n\nmt:\n\n0, 0\n139770, 42701\n214610, 65071\n338766, 102805\n431466, 130840\n553458, 167781\n652046, 197603\n769878, 233265\n869174, 263474\n986538, 298725\n1087086, 329083\n\n\n\n"
  },
  {
    "path": "Downsample/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Volume Sampling Toolbox</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n    <!--DSP-->\n    <script src=\"vendor/dsp.js\"></script>\n\n\n    <!--Mesh algorithms-->\n    <script src=\"js/surfacenets.js\"></script>\n    \n    <!--Downsamplers-->\n    <script src=\"js/nearestfilter.js\"></script>\n    <script src=\"js/boxfilter.js\"></script>\n    <script src=\"js/maxfilter.js\"></script>\n    <script src=\"js/minfilter.js\"></script>\n    <script src=\"js/medianfilter.js\"></script>\n    <script src=\"js/closing.js\"></script>\n    <script src=\"js/opening.js\"></script>\n    \n    <script src=\"js/perlinnoise.js\"></script>\n    <script src=\"js/testdata.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tVolume Resampling\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Input Data:</p>\n\t    <p><select id=\"datasource\"></select></p>\n\t    <p>Filter:</p>\n\t    <p><select id=\"filters\"></select></p>\n\t    <p>Scale:</p>\n\t    <p><select id=\"resolution\"></select></p>\n\t    <p>Show facets: <input type=\"checkbox\" id=\"showfacets\" value=\"checked\" /></p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" value=\"checked\" /></p>\n\t    <p>Volume Resolution: <input type=\"text\" id=\"volumeres\" value=\"0\" /> </p>\n\t    <p>Vertex count: <input type=\"text\" id=\"vertcount\" value=\"0\" /> </p>\n\t    <p>Face count: <input type=\"text\" id=\"facecount\" value=\"0\" /> </p>\n\t  </div> \n\t</div> \n\t\n\t<script type=\"text/javascript\">\n\t(function() {\n\t\"use strict\";\n\t\n\t  (function() {\n\t\t  var resolution = document.getElementById(\"resolution\");\n\t\t  resolution.add(new Option('1', 0), null);\n\t    for(var i=1; i<5; ++i) {\n  \t\t  resolution.add(new Option('1/' + (1<<i), i), null);\n\t    }\n\t  })();\n\t\n\t\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControls;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\t\n\t\tvar filters = {\n\t\t     'Nearest': NearestFilter\n\t\t   , 'Trilinear': BoxFilter\n\t\t   , 'Min': MinFilter\n\t\t   , 'Max': MaxFilter\n\t\t   , 'Median': MedianFilter\n\t\t   , 'Closing': ClosingFilter\n\t\t   , 'Opening': OpeningFilter\n\t\t};\n\t\tvar testdata = {};\n\t\t\n\t\t\n\t\tfunction updateMesh() {\n\t\t\n\t\t  if(surfacemesh) {\n\t\t    scene.remove(surfacemesh);\n\t\t    scene.remove(wiremesh);\n\t\t  }\n\t\t  \n\t\t  //Downsample volume\n\t\t  var field = testdata[ document.getElementById(\"datasource\").value ]()\n\t\t    , num_iters = parseInt(document.getElementById('resolution').value, 10)\n\t\t    , filter = filters[ document.getElementById(\"filters\").value ]\n\t\t    , min_dim = Math.min(field.dims[0], Math.min(field.dims[1], field.dims[2]));\n\t\t  \n\t    if((1 << num_iters) >= min_dim) {\n\t      field = { volume: new Float32Array([0,0,0,0,0,0,0,0]), dims:[1,1,1] };\n\t    } else {\n\t\t    for(var i=0; (1<<i)<min_dim && i<num_iters; ++i) {\n\t\t      field = filter(field.volume, field.dims);\n\t\t    }\n\t\t  }\n\t\t    \n\t\t  //Create mesh and display\n\t\t  var result = SurfaceNets( field.volume, field.dims );\n      \n      //Update statistics\n      document.getElementById(\"volumeres\").value = field.dims[0] + 'x' + field.dims[1] + 'x' + field.dims[2];\n      document.getElementById(\"vertcount\").value = result.vertices.length;\n      document.getElementById(\"facecount\").value = result.faces.length;\n      \n      //Create surface mesh      \n      geometry = new THREE.Geometry();  \t      \n      for(var i=0; i<result.vertices.length; ++i) {\n        var v = result.vertices[i];\n        geometry.vertices.push(new THREE.Vector3(v[0], v[1], v[2]));\n      }\n      \n      for(var i=0; i<result.faces.length; ++i) {\n        var f = result.faces[i];\n        geometry.faces.push(new THREE.Face4(f[0], f[1], f[2], f[3]));\n      }\n      \n      geometry.computeFaceNormals();\n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n\t\t\t\n      var bb = geometry.boundingBox\n        , maxdim = 1.0;\n      for(var i=0; i<3; ++i) {\n        maxdim = Math.max(maxdim, field.dims[i]);\n      }\n      var scale = 1.0 / maxdim;\n      \n      \n      var material\t= new THREE.MeshNormalMaterial();\n      surfacemesh\t= new THREE.Mesh( geometry, material );\n      surfacemesh.doubleSided = true;\n      var wirematerial = new THREE.MeshBasicMaterial({\n          color : 0xffffff\n        , wireframe : true\n      });\n      wiremesh = new THREE.Mesh(geometry, wirematerial);\n      wiremesh.doubleSided = true;\n      scene.add( surfacemesh );\n      scene.add( wiremesh );\t\t\t\n\n      \n      wiremesh.scale.x = surfacemesh.scale.x = scale;\n      wiremesh.scale.y = surfacemesh.scale.y = scale;\n      wiremesh.scale.z = surfacemesh.scale.z = scale;\n      \n      wiremesh.position.x = surfacemesh.position.x = -field.dims[0] * scale * 0.5;\n      wiremesh.position.y = surfacemesh.position.y = -field.dims[1] * scale * 0.5;\n      wiremesh.position.z = surfacemesh.position.z = -field.dims[2] * scale * 0.5;\n      \n      scene.remove(surfacemesh);\n      scene.add(surfacemesh);\n      scene.remove(wiremesh);\n      scene.add(wiremesh);\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\t\t\t\t\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 3);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\t\t\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n\t\t\t// here you add your objects\n\t\t\t// - you will most likely replace this part by your own\n\t\t\tvar light\t= new THREE.AmbientLight( Math.random() * 0xffffff );\n\t\t\tscene.add( light );\n\t\t\tvar light\t= new THREE.DirectionalLight( Math.random() * 0xffffff );\n\t\t\tlight.position.set( Math.random(), Math.random(), Math.random() ).normalize();\n\t\t\tscene.add( light );\n\t\t\t\n\t\t\t//Initialize dom elements\n\t\t\ttestdata = createTestData();\n\t\t\tvar ds = document.getElementById(\"datasource\");\n\t\t\tfor(var id in testdata) {\n\t\t\t  ds.add(new Option(id, id), null);\n\t\t\t}\n\t\t\tds.onchange = updateMesh;\n\t\t\tvar ms = document.getElementById(\"filters\");\n\t\t\tfor(var alg in filters) {\n\t\t\t  ms.add(new Option(alg, alg), null);\n\t\t\t}\n\t\t\tms.onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"resolution\").onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"showfacets\").checked = true;\n\t\t\tdocument.getElementById(\"showedges\").checked  = true;\n\t\t\t\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      surfacemesh.visible = document.getElementById(\"showfacets\").checked;\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t})();\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "Downsample/js/boxfilter.js",
    "content": "\n//Naive box filter for downsampling volume\nfunction BoxFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n  \n    var s = 0.0;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0) {\n        iz = -iz;\n      }\n      if(iz >= dims[2]) {\n        iz = 2*dims[2]-2-iz;\n      }\n      \n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0) {\n          iy = -iy;\n        }\n        if(iy >= dims[1]) {\n          iy = 2*dims[1]-2-iy;\n        }\n        \n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0) {\n            ix = -ix;\n          }\n          if(ix >= dims[0]) {\n            ix = 2*dims[0]-2-ix;\n          }\n          s += volume[ix+dims[0]*(iy+dims[1]*(iz))] / (1 << (Math.abs(dx) + Math.abs(dy) + Math.abs(dz)));\n        }\n      }\n    }\n    nvolume[n++] = s / 8.0;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/closing.js",
    "content": "\n//Morophological closing filter\nfunction ClosingFilter(volume, dims) {\n  \"use strict\";\n  \n\n  //Dilate\n  var pvolume = new Float32Array(dims[0] * dims[1] * dims[2])\n    , n = 0;\n  for(var k=0; k<dims[2]; ++k)\n  for(var j=0; j<dims[1]; ++j)\n  for(var i=0; i<dims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    pvolume[n++] = s;\n  }\n  \n  //Erode and downsample\n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2]);\n  n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = 2*k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = 2*j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = 2*i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, pvolume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/marchingcubes.js",
    "content": "/**\n * Javascript Marching Cubes\n *\n * Based on Paul Bourke's classic implementation:\n *    http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * JS port by Mikola Lysenko\n */\n\nvar MarchingCubes = (function() {\nvar edgeTable= new Uint32Array([\n      0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n      0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n      0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n      0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n      0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n      0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n      0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n      0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n      0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n      0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n      0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n      0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n      0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n      0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n      0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n      0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n      0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n      0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n      0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n      0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n      0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n      0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n      0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n      0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n      0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n      0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n      0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n      0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n      0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n      0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n      0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n      0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   ])\n  , triTable = [\n      [],\n      [0, 8, 3],\n      [0, 1, 9],\n      [1, 8, 3, 9, 8, 1],\n      [1, 2, 10],\n      [0, 8, 3, 1, 2, 10],\n      [9, 2, 10, 0, 2, 9],\n      [2, 8, 3, 2, 10, 8, 10, 9, 8],\n      [3, 11, 2],\n      [0, 11, 2, 8, 11, 0],\n      [1, 9, 0, 2, 3, 11],\n      [1, 11, 2, 1, 9, 11, 9, 8, 11],\n      [3, 10, 1, 11, 10, 3],\n      [0, 10, 1, 0, 8, 10, 8, 11, 10],\n      [3, 9, 0, 3, 11, 9, 11, 10, 9],\n      [9, 8, 10, 10, 8, 11],\n      [4, 7, 8],\n      [4, 3, 0, 7, 3, 4],\n      [0, 1, 9, 8, 4, 7],\n      [4, 1, 9, 4, 7, 1, 7, 3, 1],\n      [1, 2, 10, 8, 4, 7],\n      [3, 4, 7, 3, 0, 4, 1, 2, 10],\n      [9, 2, 10, 9, 0, 2, 8, 4, 7],\n      [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n      [8, 4, 7, 3, 11, 2],\n      [11, 4, 7, 11, 2, 4, 2, 0, 4],\n      [9, 0, 1, 8, 4, 7, 2, 3, 11],\n      [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1],\n      [3, 10, 1, 3, 11, 10, 7, 8, 4],\n      [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4],\n      [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3],\n      [4, 7, 11, 4, 11, 9, 9, 11, 10],\n      [9, 5, 4],\n      [9, 5, 4, 0, 8, 3],\n      [0, 5, 4, 1, 5, 0],\n      [8, 5, 4, 8, 3, 5, 3, 1, 5],\n      [1, 2, 10, 9, 5, 4],\n      [3, 0, 8, 1, 2, 10, 4, 9, 5],\n      [5, 2, 10, 5, 4, 2, 4, 0, 2],\n      [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n      [9, 5, 4, 2, 3, 11],\n      [0, 11, 2, 0, 8, 11, 4, 9, 5],\n      [0, 5, 4, 0, 1, 5, 2, 3, 11],\n      [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5],\n      [10, 3, 11, 10, 1, 3, 9, 5, 4],\n      [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10],\n      [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3],\n      [5, 4, 8, 5, 8, 10, 10, 8, 11],\n      [9, 7, 8, 5, 7, 9],\n      [9, 3, 0, 9, 5, 3, 5, 7, 3],\n      [0, 7, 8, 0, 1, 7, 1, 5, 7],\n      [1, 5, 3, 3, 5, 7],\n      [9, 7, 8, 9, 5, 7, 10, 1, 2],\n      [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3],\n      [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2],\n      [2, 10, 5, 2, 5, 3, 3, 5, 7],\n      [7, 9, 5, 7, 8, 9, 3, 11, 2],\n      [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11],\n      [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7],\n      [11, 2, 1, 11, 1, 7, 7, 1, 5],\n      [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11],\n      [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0],\n      [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0],\n      [11, 10, 5, 7, 11, 5],\n      [10, 6, 5],\n      [0, 8, 3, 5, 10, 6],\n      [9, 0, 1, 5, 10, 6],\n      [1, 8, 3, 1, 9, 8, 5, 10, 6],\n      [1, 6, 5, 2, 6, 1],\n      [1, 6, 5, 1, 2, 6, 3, 0, 8],\n      [9, 6, 5, 9, 0, 6, 0, 2, 6],\n      [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n      [2, 3, 11, 10, 6, 5],\n      [11, 0, 8, 11, 2, 0, 10, 6, 5],\n      [0, 1, 9, 2, 3, 11, 5, 10, 6],\n      [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11],\n      [6, 3, 11, 6, 5, 3, 5, 1, 3],\n      [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6],\n      [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9],\n      [6, 5, 9, 6, 9, 11, 11, 9, 8],\n      [5, 10, 6, 4, 7, 8],\n      [4, 3, 0, 4, 7, 3, 6, 5, 10],\n      [1, 9, 0, 5, 10, 6, 8, 4, 7],\n      [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4],\n      [6, 1, 2, 6, 5, 1, 4, 7, 8],\n      [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7],\n      [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6],\n      [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n      [3, 11, 2, 7, 8, 4, 10, 6, 5],\n      [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11],\n      [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6],\n      [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6],\n      [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6],\n      [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11],\n      [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7],\n      [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n      [10, 4, 9, 6, 4, 10],\n      [4, 10, 6, 4, 9, 10, 0, 8, 3],\n      [10, 0, 1, 10, 6, 0, 6, 4, 0],\n      [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10],\n      [1, 4, 9, 1, 2, 4, 2, 6, 4],\n      [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4],\n      [0, 2, 4, 4, 2, 6],\n      [8, 3, 2, 8, 2, 4, 4, 2, 6],\n      [10, 4, 9, 10, 6, 4, 11, 2, 3],\n      [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6],\n      [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10],\n      [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1],\n      [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3],\n      [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1],\n      [3, 11, 6, 3, 6, 0, 0, 6, 4],\n      [6, 4, 8, 11, 6, 8],\n      [7, 10, 6, 7, 8, 10, 8, 9, 10],\n      [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10],\n      [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0],\n      [10, 6, 7, 10, 7, 1, 1, 7, 3],\n      [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7],\n      [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9],\n      [7, 8, 0, 7, 0, 6, 6, 0, 2],\n      [7, 3, 2, 6, 7, 2],\n      [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7],\n      [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7],\n      [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11],\n      [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1],\n      [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6],\n      [0, 9, 1, 11, 6, 7],\n      [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0],\n      [7, 11, 6],\n      [7, 6, 11],\n      [3, 0, 8, 11, 7, 6],\n      [0, 1, 9, 11, 7, 6],\n      [8, 1, 9, 8, 3, 1, 11, 7, 6],\n      [10, 1, 2, 6, 11, 7],\n      [1, 2, 10, 3, 0, 8, 6, 11, 7],\n      [2, 9, 0, 2, 10, 9, 6, 11, 7],\n      [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n      [7, 2, 3, 6, 2, 7],\n      [7, 0, 8, 7, 6, 0, 6, 2, 0],\n      [2, 7, 6, 2, 3, 7, 0, 1, 9],\n      [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6],\n      [10, 7, 6, 10, 1, 7, 1, 3, 7],\n      [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8],\n      [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7],\n      [7, 6, 10, 7, 10, 8, 8, 10, 9],\n      [6, 8, 4, 11, 8, 6],\n      [3, 6, 11, 3, 0, 6, 0, 4, 6],\n      [8, 6, 11, 8, 4, 6, 9, 0, 1],\n      [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6],\n      [6, 8, 4, 6, 11, 8, 2, 10, 1],\n      [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6],\n      [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9],\n      [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n      [8, 2, 3, 8, 4, 2, 4, 6, 2],\n      [0, 4, 2, 4, 6, 2],\n      [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8],\n      [1, 9, 4, 1, 4, 2, 2, 4, 6],\n      [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1],\n      [10, 1, 0, 10, 0, 6, 6, 0, 4],\n      [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3],\n      [10, 9, 4, 6, 10, 4],\n      [4, 9, 5, 7, 6, 11],\n      [0, 8, 3, 4, 9, 5, 11, 7, 6],\n      [5, 0, 1, 5, 4, 0, 7, 6, 11],\n      [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5],\n      [9, 5, 4, 10, 1, 2, 7, 6, 11],\n      [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5],\n      [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2],\n      [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n      [7, 2, 3, 7, 6, 2, 5, 4, 9],\n      [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7],\n      [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0],\n      [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8],\n      [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7],\n      [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4],\n      [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10],\n      [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n      [6, 9, 5, 6, 11, 9, 11, 8, 9],\n      [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5],\n      [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11],\n      [6, 11, 3, 6, 3, 5, 5, 3, 1],\n      [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6],\n      [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10],\n      [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5],\n      [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n      [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2],\n      [9, 5, 6, 9, 6, 0, 0, 6, 2],\n      [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8],\n      [1, 5, 6, 2, 1, 6],\n      [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6],\n      [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0],\n      [0, 3, 8, 5, 6, 10],\n      [10, 5, 6],\n      [11, 5, 10, 7, 5, 11],\n      [11, 5, 10, 11, 7, 5, 8, 3, 0],\n      [5, 11, 7, 5, 10, 11, 1, 9, 0],\n      [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1],\n      [11, 1, 2, 11, 7, 1, 7, 5, 1],\n      [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11],\n      [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7],\n      [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n      [2, 5, 10, 2, 3, 5, 3, 7, 5],\n      [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5],\n      [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2],\n      [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2],\n      [1, 3, 5, 3, 7, 5],\n      [0, 8, 7, 0, 7, 1, 1, 7, 5],\n      [9, 0, 3, 9, 3, 5, 5, 3, 7],\n      [9, 8, 7, 5, 9, 7],\n      [5, 8, 4, 5, 10, 8, 10, 11, 8],\n      [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0],\n      [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5],\n      [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4],\n      [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8],\n      [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11],\n      [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5],\n      [9, 4, 5, 2, 11, 3],\n      [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4],\n      [5, 10, 2, 5, 2, 4, 4, 2, 0],\n      [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9],\n      [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2],\n      [8, 4, 5, 8, 5, 3, 3, 5, 1],\n      [0, 4, 5, 1, 0, 5],\n      [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5],\n      [9, 4, 5],\n      [4, 11, 7, 4, 9, 11, 9, 10, 11],\n      [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11],\n      [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11],\n      [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4],\n      [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2],\n      [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3],\n      [11, 7, 4, 11, 4, 2, 2, 4, 0],\n      [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n      [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9],\n      [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7],\n      [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10],\n      [1, 10, 2, 8, 7, 4],\n      [4, 9, 1, 4, 1, 7, 7, 1, 3],\n      [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1],\n      [4, 0, 3, 7, 4, 3],\n      [4, 8, 7],\n      [9, 10, 8, 10, 11, 8],\n      [3, 0, 9, 3, 9, 11, 11, 9, 10],\n      [0, 1, 10, 0, 10, 8, 8, 10, 11],\n      [3, 1, 10, 11, 3, 10],\n      [1, 2, 11, 1, 11, 9, 9, 11, 8],\n      [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9],\n      [0, 2, 11, 8, 0, 11],\n      [3, 2, 11],\n      [2, 3, 8, 2, 8, 10, 10, 8, 9],\n      [9, 10, 2, 0, 9, 2],\n      [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8],\n      [1, 10, 2],\n      [1, 3, 8, 9, 1, 8],\n      [0, 9, 1],\n      [0, 3, 8],\n      []]\n  , cubeVerts = [\n     [0,0,0]\n    ,[1,0,0]\n    ,[1,1,0]\n    ,[0,1,0]\n    ,[0,0,1]\n    ,[1,0,1]\n    ,[1,1,1]\n    ,[0,1,1]]\n  , edgeIndex = [ [0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7] ];\n\nreturn function(data, dims) {\n  var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = new Int32Array(3);\n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //For each cell, compute cube mask\n    var cube_index = 0;\n    for(var i=0; i<8; ++i) {\n      var v = cubeVerts[i]\n        , s = data[n + v[0] + dims[0] * (v[1] + dims[1] * v[2])];\n      grid[i] = s;\n      cube_index |= (s > 0) ? 1 << i : 0;\n    }\n    //Compute vertices\n    var edge_mask = edgeTable[cube_index];\n    if(edge_mask === 0) {\n      continue;\n    }\n    for(var i=0; i<12; ++i) {\n      if((edge_mask & (1<<i)) === 0) {\n        continue;\n      }\n      edges[i] = vertices.length;\n      var nv = [0,0,0]\n        , e = edgeIndex[i]\n        , p0 = cubeVerts[e[0]]\n        , p1 = cubeVerts[e[1]]\n        , a = grid[e[0]]\n        , b = grid[e[1]]\n        , d = a - b\n        , t = 0;\n      if(Math.abs(d) > 1e-6) {\n        t = a / d;\n      }\n      for(var j=0; j<3; ++j) {\n        nv[j] = (x[j] + p0[j]) + t * (p1[j] - p0[j]);\n      }\n      vertices.push(nv);\n    }\n    //Add faces\n    var f = triTable[cube_index];\n    for(var i=0; i<f.length; i += 3) {\n      faces.push([edges[f[i]], edges[f[i+1]], edges[f[i+2]]]);\n    }\n  }\n  return { vertices: vertices, faces: faces };\n};\n})();\n\nif(exports) {\n  exports.mesher = MarchingCubes;\n}\n\n"
  },
  {
    "path": "Downsample/js/marchingtetrahedra.js",
    "content": "/**\n * Marching Tetrahedra in Javascript\n *\n * Based on Paul Bourke's implementation\n *  http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * (Several bug fixes were made to deal with oriented faces)\n *\n * Javascript port by Mikola Lysenko\n */\nvar MarchingTetrahedra = (function() {\nvar cube_vertices = [\n        [0,0,0]\n      , [1,0,0]\n      , [1,1,0]\n      , [0,1,0]\n      , [0,0,1]\n      , [1,0,1]\n      , [1,1,1]\n      , [0,1,1] ]\n  , tetra_list = [\n        [0,2,3,7]\n      , [0,6,2,7]\n      , [0,4,6,7]\n      , [0,6,1,2]\n      , [0,1,6,4]\n      , [5,6,1,4] ];\n\nreturn function(data, dims) {\n   \n   var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = [0,0,0];\n    \n  function interp(i0, i1) {\n    var g0 = grid[i0]\n      , g1 = grid[i1]\n      , p0 = cube_vertices[i0]\n      , p1 = cube_vertices[i1]\n      , v  = [x[0], x[1], x[2]]\n      , t = g0 - g1;\n    if(Math.abs(t) > 1e-6) {\n      t = g0 / t;\n    }\n    for(var i=0; i<3; ++i) {\n      v[i] += p0[i] + t * (p1[i] - p0[i]);\n    }\n    vertices.push(v);\n    return vertices.length - 1;\n  }\n  \n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //Read in cube  \n    for(var i=0; i<8; ++i) {\n      grid[i] = data[n + cube_vertices[i][0] + dims[0] * (cube_vertices[i][1] + dims[1] * cube_vertices[i][2])];\n    }\n    for(var i=0; i<tetra_list.length; ++i) {\n      var T = tetra_list[i]\n        , triindex = 0;\n      if (grid[T[0]] < 0) triindex |= 1;\n      if (grid[T[1]] < 0) triindex |= 2;\n      if (grid[T[2]] < 0) triindex |= 4;\n      if (grid[T[3]] < 0) triindex |= 8;\n      \n      //Handle each case\n      switch (triindex) {\n        case 0x00:\n        case 0x0F:\n        break;\n        case 0x0E:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[3]) \n            , interp(T[0], T[2]) ]);\n        break;\n        case 0x01:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[2])\n            , interp(T[0], T[3])  ]);\n        break;\n        case 0x0D:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[2]) \n            , interp(T[1], T[3]) ]);\n        break;\n        case 0x02:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[3])\n            , interp(T[1], T[2]) ]);\n        break;\n        case 0x0C:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[1], T[3])\n              , interp(T[0], T[3])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x03:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[0], T[2])\n              , interp(T[0], T[3])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x04:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[1])\n              , interp(T[2], T[3]) ]);\n        break;\n        case 0x0B:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[3]) \n              , interp(T[2], T[1]) ]);\n        break;\n        case 0x05:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[1], T[2])\n              , interp(T[2], T[3])\n              , interp(T[0], T[3]) ]);\n        break;\n        case 0x0A:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[0], T[3])\n              , interp(T[2], T[3])\n              , interp(T[1], T[2]) ]);\n        break;\n        case 0x06:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[0], T[2])\n              , interp(T[0], T[1])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x09:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[1], T[3])\n              , interp(T[0], T[1])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x07:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[1])\n              , interp(T[3], T[2]) ]);\n        break;\n        case 0x08:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[2])\n              , interp(T[3], T[1]) ]);\n        break;\n      }\n    }\n  }\n  \n  return { vertices: vertices, faces: faces };\n}\n})();\n\n\nif(exports) {\n  exports.mesher = MarchingTetrahedra;\n}\n"
  },
  {
    "path": "Downsample/js/maxfilter.js",
    "content": "\n//Maximum filter\nfunction MaxFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/medianfilter.js",
    "content": "\n//Median filter\nfunction MedianFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0\n    , ranks = new Array(27);\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var idx = 0;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0) {\n        iz = -iz;\n      }\n      if(iz >= dims[2]) {\n        iz = 2*dims[2]-2-iz;\n      }\n      \n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0) {\n          iy = -iy;\n        }\n        if(iy >= dims[1]) {\n          iy = 2*dims[1]-2-iy;\n        }\n        \n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0) {\n            ix = -ix;\n          }\n          if(ix >= dims[0]) {\n            ix = 2*dims[0]-2-ix;\n          }\n          ranks[idx++] = volume[ix+dims[0]*(iy+dims[1]*(iz))];\n        }\n      }\n    }\n    var ranked = ranks.sort(function(a,b){ return b < a ? -1 : b>a ? 1 : 0; });\n    nvolume[n++] = 0.5 * (ranked[Math.floor(idx/2)] + ranked[Math.floor(idx/2)+1]);\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/minfilter.js",
    "content": "\n//Minimum filter\nfunction MinFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/nearestfilter.js",
    "content": "\n//Naive box filter for downsampling volume\nfunction NearestFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    if(2*i < dims[0] && 2*j < dims[1] && 2*k < dims[2]) {\n      nvolume[n++] = volume[2*i + dims[0] * (2*j + dims[1] * (2* k))];\n    } else {\n      nvolume[n++] = 1.0;\n    }\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/opening.js",
    "content": "\n//Morophological opening filter\nfunction OpeningFilter(volume, dims) {\n  \"use strict\";\n  \n\n  //Erode\n  var pvolume = new Float32Array(dims[0] * dims[1] * dims[2])\n    , n = 0;\n  for(var k=0; k<dims[2]; ++k)\n  for(var j=0; j<dims[1]; ++j)\n  for(var i=0; i<dims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    pvolume[n++] = s;\n  }\n  \n  //Dilate\n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.ceil(dims[i]/2);\n  }\n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2]);\n  n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = 2*k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = 2*j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = 2*i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, pvolume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "Downsample/js/perlinnoise.js",
    "content": "\n//This code is from Kas Thomas' blog:\n//  http://asserttrue.blogspot.de/2011/12/perlin-noise-in-javascript_31.html\n\n// This is a port of Ken Perlin's Java code. The\n// original Java code is at http://cs.nyu.edu/%7Eperlin/noise/.\n// Note that in this version, a number from 0 to 1 is returned.\nPerlinNoise = new function() {\n\nthis.noise = function(x, y, z) {\n\n   var p = new Array(512)\n   var permutation = [ 151,160,137,91,90,15,\n   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n   ];\n   for (var i=0; i < 256 ; i++) \n p[256+i] = p[i] = permutation[i]; \n\n      var X = Math.floor(x) & 255,                  // FIND UNIT CUBE THAT\n          Y = Math.floor(y) & 255,                  // CONTAINS POINT.\n          Z = Math.floor(z) & 255;\n      x -= Math.floor(x);                                // FIND RELATIVE X,Y,Z\n      y -= Math.floor(y);                                // OF POINT IN CUBE.\n      z -= Math.floor(z);\n      var    u = fade(x),                                // COMPUTE FADE CURVES\n             v = fade(y),                                // FOR EACH OF X,Y,Z.\n             w = fade(z);\n      var A = p[X  ]+Y, AA = p[A]+Z, AB = p[A+1]+Z,      // HASH COORDINATES OF\n          B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;      // THE 8 CUBE CORNERS,\n\n      return scale(lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ),  // AND ADD\n                                     grad(p[BA  ], x-1, y  , z   )), // BLENDED\n                             lerp(u, grad(p[AB  ], x  , y-1, z   ),  // RESULTS\n                                     grad(p[BB  ], x-1, y-1, z   ))),// FROM  8\n                     lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  // CORNERS\n                                     grad(p[BA+1], x-1, y  , z-1 )), // OF CUBE\n                             lerp(u, grad(p[AB+1], x  , y-1, z-1 ),\n                                     grad(p[BB+1], x-1, y-1, z-1 )))));\n   }\n   function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n   function lerp( t, a, b) { return a + t * (b - a); }\n   function grad(hash, x, y, z) {\n      var h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE\n      var u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.\n             v = h<4 ? y : h==12||h==14 ? x : z;\n      return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);\n   } \n   function scale(n) { return (1 + n)/2; }\n}\n"
  },
  {
    "path": "Downsample/js/surfacenets.js",
    "content": "/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\nvar SurfaceNets = (function() {\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Int32Array(4096);\n\nreturn function(data, dims) {\n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = new Int32Array(3)\n    , R = new Int32Array([1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)])\n    , grid = new Float32Array(8)\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    buffer = new Int32Array(R[2] * 2);\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { vertices: vertices, faces: faces };\n};\n})();\n"
  },
  {
    "path": "Downsample/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function triangle_wave(t) {\n    var it = Math.floor(t);\n    if(!!(it & 1)) {\n      return t - it;\n    }\n    return 1 - (t-it);\n  }\n  \n  function memoize(f) {\n    var cached = null;\n    return function() {\n      if(cached === null) { \n        cached = f();\n      }\n      return cached;\n    }\n  }\n  \n  function makeVolume(dims, f) {\n    return memoize(function() {\n      var res = new Array(3);\n      for(var i=0; i<3; ++i) {\n        res[i] = 2 + Math.ceil((dims[i][1] - dims[i][0]) / dims[i][2]);\n      }\n      var volume = new Float32Array(res[0] * res[1] * res[2])\n        , n = 0;\n      for(var k=0, z=dims[2][0]-dims[2][2]; k<res[2]; ++k, z+=dims[2][2])\n      for(var j=0, y=dims[1][0]-dims[1][2]; j<res[1]; ++j, y+=dims[1][2])\n      for(var i=0, x=dims[0][0]-dims[0][2]; i<res[0]; ++i, x+=dims[0][2], ++n) {\n        volume[n] = f(x,y,z);\n      }\n      return {volume: volume, dims:res};\n    });\n  } \n\n  result['Sphere'] = makeVolume(\n    [[-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05]],\n    function(x,y,z) {\n      var r = Math.sqrt(x*x + y*y + z*z);\n      return r - 0.64;\n    }\n  )\n\n  result['Torus'] = makeVolume(\n    [[-2.2, 2.2, 4.4 / 62.0],\n     [-2.2, 2.2, 4.4 / 62.0],\n     [-1.4, 1.4, 4.4 / 62.0]],\n    function(x,y,z) {\n      return Math.pow(1.0 - Math.sqrt(x*x + y*y), 2) + z*z - 0.25;\n    }\n  );\n  \n  result['Hyperboloid'] = makeVolume(\n    [[-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0]],\n    function(x,y,z) {\n      return Math.max(-1.4-z, Math.max(z-1.4,x*x + y*y - z*z - 0.1));\n    }\n  );\n  \n  result['Paraboloid'] = makeVolume(\n    [[-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0],\n     [-0.5, 2.5, 3.0/62.0]],\n    function(x,y,z) {\n      return Math.max(z-1.75, x*x + y*y - z);\n    }\n  )\n  \n  result['Saddle'] = makeVolume(\n    [[-2.0, 2.0, 4.0/94.0],\n     [-2.0, 2.0, 4.0/94.0],\n     [-2.0, 2.0, 4.0/94.0]],\n    function(x,y,z) {\n      return x*x - y*y - z;\n    }\n  )\n  \n\n  \n  \n  result['Hyperelliptic'] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      return Math.pow( Math.pow(x, 6) + Math.pow(y, 6) + Math.pow(z, 6), 1.0/6.0 ) - 1.0;\n    }  \n  );\n  \n  result['Thin Plates'] = makeVolume(\n    [[1, 63, 1],\n     [1, 63, 1],\n     [1, 63, 1]],\n    function(x,y,z) {\n      var t = 7.0 * triangle_wave(x / 7.0) - 0.5;\n      if( x < 10 ) {\n        t = Math.max(t, 10-x);\n      }\n      if( y < 10 ) {\n        t = Math.max(t, 10-y);\n      }\n      if( z < 10 )  {\n        t = Math.max(t, 10-z);\n      }\n      if( x > 54 ) {\n        t = Math.max(t, x - 54);\n      }\n      if( y > 54 ) {\n        t = Math.max(t, y - 54);\n      }\n      if( z > 54 ) {\n        t = Math.max(t, z - 54);\n      }\n      return t;\n    }\n  );\n  \n  \n  result[\"Goursat's Surface\"] = makeVolume(\n    [[-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0]],\n    function(x,y,z) {\n      return Math.pow(x,4) + Math.pow(y,4) + Math.pow(z,4) - 1.5 * (x*x  + y*y + z*z) + 1;\n    }\n  );\n  \n  result[\"Heart\"] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      y *= 1.5;\n      z *= 1.5;\n      return Math.pow(2*x*x+y*y+2*z*z-1, 3) - 0.1 * z*z*y*y*y - y*y*y*x*x;\n    }\n  );\n  \n  result['Noise (Slow)'] = makeVolume(\n    [[-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0]], \n    function(x,y,z) {\n      if(x < -1.0 || x > 1.0 ||\n         y < -1.0 || y > 1.0 ||\n         z < -1.0 || z > 1.0 ) {\n        return 0.6;   \n      }\n      return 0.6 - PerlinNoise.noise(4.0 * x, 4.0 * y, 4.0 * z);\n    }\n  );\n    \n  result['Asteroid (Slow)'] = makeVolume(\n    [[-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0]],\n    function(x,y,z) {\n      return (x*x + y*y + z*z) - PerlinNoise.noise(x*2,y*2,z*2);\n    }\n  );\n  \n  result['Terrain (Slow)'] = makeVolume(\n    [[-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0]],\n    function(x,y,z) {\n      return  y + PerlinNoise.noise(x*2+5,y*2+3,z*2+0.6);\n    }\n  );\n  \n  \n  result['Empty'] = function(){ return { volume: new Float32Array(32*32*32), dims:[32,32,32] } };\n  \n  return result;\n}\n"
  },
  {
    "path": "Downsample/vendor/dsp.js",
    "content": "/* \n *  DSP.js - a comprehensive digital signal processing  library for javascript\n * \n *  Created by Corban Brook <corbanbrook@gmail.com> on 2010-01-01.\n *  Copyright 2010 Corban Brook. All rights reserved.\n *\n */\n\n////////////////////////////////////////////////////////////////////////////////\n//                                  CONSTANTS                                 //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DSP is an object which contains general purpose utility functions and constants\n */\nvar DSP = {\n  // Channels\n  LEFT:           0,\n  RIGHT:          1,\n  MIX:            2,\n\n  // Waveforms\n  SINE:           1,\n  TRIANGLE:       2,\n  SAW:            3,\n  SQUARE:         4,\n\n  // Filters\n  LOWPASS:        0,\n  HIGHPASS:       1,\n  BANDPASS:       2,\n  NOTCH:          3,\n\n  // Window functions\n  BARTLETT:       1,\n  BARTLETTHANN:   2,\n  BLACKMAN:       3,\n  COSINE:         4,\n  GAUSS:          5,\n  HAMMING:        6,\n  HANN:           7,\n  LANCZOS:        8,\n  RECTANGULAR:    9,\n  TRIANGULAR:     10,\n\n  // Loop modes\n  OFF:            0,\n  FW:             1,\n  BW:             2,\n  FWBW:           3,\n\n  // Math\n  TWO_PI:         2*Math.PI\n};\n\n// Setup arrays for platforms which do not support byte arrays\nfunction setupTypedArray(name, fallback) {\n  // check if TypedArray exists\n  // typeof on Minefield and Chrome return function, typeof on Webkit returns object.\n  if (typeof this[name] !== \"function\" && typeof this[name] !== \"object\") {\n    // nope.. check if WebGLArray exists\n    if (typeof this[fallback] === \"function\" && typeof this[fallback] !== \"object\") {\n      this[name] = this[fallback];\n    } else {\n      // nope.. set as Native JS array\n      this[name] = function(obj) {\n        if (obj instanceof Array) {\n          return obj;\n        } else if (typeof obj === \"number\") {\n          return new Array(obj);\n        }\n      };\n    }\n  }\n}\n\nsetupTypedArray(\"Float32Array\", \"WebGLFloatArray\");\nsetupTypedArray(\"Int32Array\",   \"WebGLIntArray\");\nsetupTypedArray(\"Uint16Array\",  \"WebGLUnsignedShortArray\");\nsetupTypedArray(\"Uint8Array\",   \"WebGLUnsignedByteArray\");\n\n\n////////////////////////////////////////////////////////////////////////////////\n//                            DSP UTILITY FUNCTIONS                           //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Inverts the phase of a signal\n *\n * @param {Array} buffer A sample buffer\n *\n * @returns The inverted sample buffer\n */\nDSP.invert = function(buffer) {\n  for (var i = 0, len = buffer.length; i < len; i++) {\n    buffer[i] *= -1;\n  }\n\n  return buffer;\n};\n\n/**\n * Converts split-stereo (dual mono) sample buffers into a stereo interleaved sample buffer\n *\n * @param {Array} left  A sample buffer\n * @param {Array} right A sample buffer\n *\n * @returns The stereo interleaved buffer\n */\nDSP.interleave = function(left, right) {\n  if (left.length !== right.length) {\n    throw \"Can not interleave. Channel lengths differ.\";\n  }\n \n  var stereoInterleaved = new Float32Array(left.length * 2);\n \n  for (var i = 0, len = left.length; i < len; i++) {\n    stereoInterleaved[2*i]   = left[i];\n    stereoInterleaved[2*i+1] = right[i];\n  }\n \n  return stereoInterleaved;\n};\n\n/**\n * Converts a stereo-interleaved sample buffer into split-stereo (dual mono) sample buffers\n *\n * @param {Array} buffer A stereo-interleaved sample buffer\n *\n * @returns an Array containing left and right channels\n */\nDSP.deinterleave = (function() {\n  var left, right, mix, deinterleaveChannel = []; \n\n  deinterleaveChannel[DSP.MIX] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      mix[i] = (buffer[2*i] + buffer[2*i+1]) / 2;\n    }\n    return mix;\n  };\n\n  deinterleaveChannel[DSP.LEFT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      left[i]  = buffer[2*i];\n    }\n    return left;\n  };\n\n  deinterleaveChannel[DSP.RIGHT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      right[i]  = buffer[2*i+1];\n    }\n    return right;\n  };\n\n  return function(channel, buffer) { \n    left  = left  || new Float32Array(buffer.length/2);\n    right = right || new Float32Array(buffer.length/2);\n    mix   = mix   || new Float32Array(buffer.length/2);\n\n    if (buffer.length/2 !== left.length) {\n      left  = new Float32Array(buffer.length/2);\n      right = new Float32Array(buffer.length/2);\n      mix   = new Float32Array(buffer.length/2);\n    }\n\n    return deinterleaveChannel[channel](buffer);\n  };\n}());\n\n/**\n * Separates a channel from a stereo-interleaved sample buffer\n *\n * @param {Array}  buffer A stereo-interleaved sample buffer\n * @param {Number} channel A channel constant (LEFT, RIGHT, MIX)\n *\n * @returns an Array containing a signal mono sample buffer\n */\nDSP.getChannel = DSP.deinterleave;\n\n/**\n * Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible\n * to negate the second buffer while mixing and to perform a volume correction\n * on the final signal.\n *\n * @param {Array} sampleBuffer1 Array containing Float values or a Float32Array\n * @param {Array} sampleBuffer2 Array containing Float values or a Float32Array\n * @param {Boolean} negate When true inverts/flips the audio signal\n * @param {Number} volumeCorrection When you add multiple sample buffers, use this to tame your signal ;)\n *\n * @returns A new Float32Array interleaved buffer.\n */\nDSP.mixSampleBuffers = function(sampleBuffer1, sampleBuffer2, negate, volumeCorrection){\n  var outputSamples = new Float32Array(sampleBuffer1);\n\n  for(var i = 0; i<sampleBuffer1.length; i++){\n    outputSamples[i] += (negate ? -sampleBuffer2[i] : sampleBuffer2[i]) / volumeCorrection;\n  }\n \n  return outputSamples;\n}; \n\n// Biquad filter types\nDSP.LPF = 0;                // H(s) = 1 / (s^2 + s/Q + 1)\nDSP.HPF = 1;                // H(s) = s^2 / (s^2 + s/Q + 1)\nDSP.BPF_CONSTANT_SKIRT = 2; // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\nDSP.BPF_CONSTANT_PEAK = 3;  // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\nDSP.NOTCH = 4;              // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\nDSP.APF = 5;                // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\nDSP.PEAKING_EQ = 6;         // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\nDSP.LOW_SHELF = 7;          // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\nDSP.HIGH_SHELF = 8;         // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n\n// Biquad filter parameter types\nDSP.Q = 1;\nDSP.BW = 2; // SHARED with BACKWARDS LOOP MODE\nDSP.S = 3;\n\n// Find RMS of signal\nDSP.RMS = function(buffer) {\n  var total = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    total += buffer[i] * buffer[i];\n  }\n  \n  return Math.sqrt(total / n);\n};\n\n// Find Peak of signal\nDSP.Peak = function(buffer) {\n  var peak = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    peak = (Math.abs(buffer[i]) > peak) ? Math.abs(buffer[i]) : peak; \n  }\n  \n  return peak;\n};\n\n// Fourier Transform Module used by DFT, FFT, RFFT\nfunction FourierTransform(bufferSize, sampleRate) {\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.bandwidth  = 2 / bufferSize * sampleRate / 2;\n\n  this.spectrum   = new Float32Array(bufferSize/2);\n  this.real       = new Float32Array(bufferSize);\n  this.imag       = new Float32Array(bufferSize);\n\n  this.peakBand   = 0;\n  this.peak       = 0;\n\n  /**\n   * Calculates the *middle* frequency of an FFT band.\n   *\n   * @param {Number} index The index of the FFT band.\n   *\n   * @returns The middle frequency in Hz.\n   */\n  this.getBandFrequency = function(index) {\n    return this.bandwidth * index + this.bandwidth / 2;\n  };\n\n  this.calculateSpectrum = function() {\n    var spectrum  = this.spectrum,\n        real      = this.real,\n        imag      = this.imag,\n        bSi       = 2 / this.bufferSize,\n        sqrt      = Math.sqrt,\n        rval, \n        ival,\n        mag;\n\n    for (var i = 0, N = bufferSize/2; i < N; i++) {\n      rval = real[i];\n      ival = imag[i];\n      mag = bSi * sqrt(rval * rval + ival * ival);\n\n      if (mag > this.peak) {\n        this.peakBand = i;\n        this.peak = mag;\n      }\n\n      spectrum[i] = mag;\n    }\n  };\n}\n\n/**\n * DFT is a class for calculating the Discrete Fourier Transform of a signal.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction DFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  var N = bufferSize/2 * bufferSize;\n  var TWO_PI = 2 * Math.PI;\n\n  this.sinTable = new Float32Array(N);\n  this.cosTable = new Float32Array(N);\n\n  for (var i = 0; i < N; i++) {\n    this.sinTable[i] = Math.sin(i * TWO_PI / bufferSize);\n    this.cosTable[i] = Math.cos(i * TWO_PI / bufferSize);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer\n *\n * @returns The frequency spectrum array\n */\nDFT.prototype.forward = function(buffer) {\n  var real = this.real, \n      imag = this.imag,\n      rval,\n      ival;\n\n  for (var k = 0; k < this.bufferSize/2; k++) {\n    rval = 0.0;\n    ival = 0.0;\n\n    for (var n = 0; n < buffer.length; n++) {\n      rval += this.cosTable[k*n] * buffer[n];\n      ival += this.sinTable[k*n] * buffer[n];\n    }\n\n    real[k] = rval;\n    imag[k] = ival;\n  }\n\n  return this.calculateSpectrum();\n};\n\n\n/**\n * FFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction FFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n   \n  this.reverseTable = new Uint32Array(bufferSize);\n\n  var limit = 1;\n  var bit = bufferSize >> 1;\n\n  var i;\n\n  while (limit < bufferSize) {\n    for (i = 0; i < limit; i++) {\n      this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n    }\n\n    limit = limit << 1;\n    bit = bit >> 1;\n  }\n\n  this.sinTable = new Float32Array(bufferSize);\n  this.cosTable = new Float32Array(bufferSize);\n\n  for (i = 0; i < bufferSize; i++) {\n    this.sinTable[i] = Math.sin(-Math.PI/i);\n    this.cosTable[i] = Math.cos(-Math.PI/i);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer. Buffer Length must be power of 2\n *\n * @returns The frequency spectrum array\n */\nFFT.prototype.forward = function(buffer) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      real            = this.real,\n      imag            = this.imag,\n      spectrum        = this.spectrum;\n\n  var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n  if (Math.pow(2, k) !== bufferSize) { throw \"Invalid buffer size, must be a power of 2.\"; }\n  if (bufferSize !== buffer.length)  { throw \"Supplied buffer is not the same size as defined FFT. FFT Size: \" + bufferSize + \" Buffer Size: \" + buffer.length; }\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    real[i] = buffer[reverseTable[i]];\n    imag[i] = 0;\n  }\n\n  while (halfSize < bufferSize) {\n    //phaseShiftStepReal = Math.cos(-Math.PI/halfSize);\n    //phaseShiftStepImag = Math.sin(-Math.PI/halfSize);\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    \n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  return this.calculateSpectrum();\n};\n\nFFT.prototype.inverse = function(real, imag) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      spectrum        = this.spectrum;\n     \n      real = real || this.real;\n      imag = imag || this.imag;\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    imag[i] *= -1;\n  }\n\n  var revReal = new Float32Array(bufferSize);\n  var revImag = new Float32Array(bufferSize);\n \n  for (i = 0; i < real.length; i++) {\n    revReal[i] = real[reverseTable[i]];\n    revImag[i] = imag[reverseTable[i]];\n  }\n \n  real = revReal;\n  imag = revImag;\n\n  while (halfSize < bufferSize) {\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  var buffer = new Float32Array(bufferSize); // this should be reused instead\n  for (i = 0; i < bufferSize; i++) {\n    buffer[i] = real[i] / bufferSize;\n  }\n\n  return buffer;\n};\n\n/**\n * RFFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * This method currently only contains a forward transform but is highly optimized.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\n\n// lookup tables don't really gain us any speed, but they do increase\n// cache footprint, so don't use them in here\n\n// also we don't use sepearate arrays for real/imaginary parts\n\n// this one a little more than twice as fast as the one in FFT\n// however I only did the forward transform\n\n// the rest of this was translated from C, see http://www.jjj.de/fxt/\n// this is the real split radix FFT\n\nfunction RFFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  this.trans = new Float32Array(bufferSize);\n\n  this.reverseTable = new Uint32Array(bufferSize);\n\n  // don't use a lookup table to do the permute, use this instead\n  this.reverseBinPermute = function (dest, source) {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    dest[0] = source[0];\n\n    do {\n      r += halfSize;\n      dest[i] = source[r];\n      dest[r] = source[i];\n      \n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        dest[i]     = source[r]; \n        dest[r]     = source[i];\n\n        dest[nm1-i] = source[nm1-r]; \n        dest[nm1-r] = source[nm1-i];\n      }\n      i++;\n    } while (i < halfSize);\n    dest[nm1] = source[nm1];\n  };\n\n  this.generateReverseTable = function () {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    this.reverseTable[0] = 0;\n\n    do {\n      r += halfSize;\n      \n      this.reverseTable[i] = r;\n      this.reverseTable[r] = i;\n\n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        this.reverseTable[i] = r;\n        this.reverseTable[r] = i;\n\n        this.reverseTable[nm1-i] = nm1-r;\n        this.reverseTable[nm1-r] = nm1-i;\n      }\n      i++;\n    } while (i < halfSize);\n\n    this.reverseTable[nm1] = nm1;\n  };\n\n  this.generateReverseTable();\n}\n\n\n// Ordering of output:\n//\n// trans[0]     = re[0] (==zero frequency, purely real)\n// trans[1]     = re[1]\n//             ...\n// trans[n/2-1] = re[n/2-1]\n// trans[n/2]   = re[n/2]    (==nyquist frequency, purely real)\n//\n// trans[n/2+1] = im[n/2-1]\n// trans[n/2+2] = im[n/2-2]\n//             ...\n// trans[n-1]   = im[1] \n\nRFFT.prototype.forward = function(buffer) {\n  var n         = this.bufferSize, \n      spectrum  = this.spectrum,\n      x         = this.trans, \n      TWO_PI    = 2*Math.PI,\n      sqrt      = Math.sqrt,\n      i         = n >>> 1,\n      bSi       = 2 / n,\n      n2, n4, n8, nn, \n      t1, t2, t3, t4, \n      i1, i2, i3, i4, i5, i6, i7, i8, \n      st1, cc1, ss1, cc3, ss3,\n      e, \n      a,\n      rval, ival, mag; \n\n  this.reverseBinPermute(x, buffer);\n\n  /*\n  var reverseTable = this.reverseTable;\n\n  for (var k = 0, len = reverseTable.length; k < len; k++) {\n    x[k] = buffer[reverseTable[k]];\n  }\n  */\n\n  for (var ix = 0, id = 4; ix < n; id *= 4) {\n    for (var i0 = ix; i0 < n; i0 += id) {\n      //sumdiff(x[i0], x[i0+1]); // {a, b}  <--| {a+b, a-b}\n      st1 = x[i0] - x[i0+1];\n      x[i0] += x[i0+1];\n      x[i0+1] = st1;\n    } \n    ix = 2*(id-1);\n  }\n\n  n2 = 2;\n  nn = n >>> 1;\n\n  while((nn = nn >>> 1)) {\n    ix = 0;\n    n2 = n2 << 1;\n    id = n2 << 1;\n    n4 = n2 >>> 2;\n    n8 = n2 >>> 3;\n    do {\n      if(n4 !== 1) {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4];\n          x[i4] -= x[i3];\n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n     \n          i1 += n8;\n          i2 += n8;\n          i3 += n8;\n          i4 += n8;\n         \n          //sumdiff(x[i3], x[i4], t1, t2); // {s, d}  <--| {a+b, a-b}\n          t1 = x[i3] + x[i4];\n          t2 = x[i3] - x[i4];\n         \n          t1 = -t1 * Math.SQRT1_2;\n          t2 *= Math.SQRT1_2;\n     \n          // sumdiff(t1, x[i2], x[i4], x[i3]); // {s, d}  <--| {a+b, a-b}\n          st1 = x[i2];\n          x[i4] = t1 + st1; \n          x[i3] = t1 - st1;\n          \n          //sumdiff3(x[i1], t2, x[i2]); // {a, b, d} <--| {a+b, b, a-b}\n          x[i2] = x[i1] - t2;\n          x[i1] += t2;\n        }\n      } else {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4]; \n          x[i4] -= x[i3];\n          \n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n        }\n      }\n   \n      ix = (id << 1) - n2;\n      id = id << 2;\n    } while (ix < n);\n \n    e = TWO_PI / n2;\n\n    for (var j = 1; j < n8; j++) {\n      a = j * e;\n      ss1 = Math.sin(a);\n      cc1 = Math.cos(a);\n\n      //ss3 = sin(3*a); cc3 = cos(3*a);\n      cc3 = 4*cc1*(cc1*cc1-0.75);\n      ss3 = 4*ss1*(0.75-ss1*ss1);\n   \n      ix = 0; id = n2 << 1;\n      do {\n        for (i0 = ix; i0 < n; i0 += id) {\n          i1 = i0 + j;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n       \n          i5 = i0 + n4 - j;\n          i6 = i5 + n4;\n          i7 = i6 + n4;\n          i8 = i7 + n4;\n       \n          //cmult(c, s, x, y, &u, &v)\n          //cmult(cc1, ss1, x[i7], x[i3], t2, t1); // {u,v} <--| {x*c-y*s, x*s+y*c}\n          t2 = x[i7]*cc1 - x[i3]*ss1; \n          t1 = x[i7]*ss1 + x[i3]*cc1;\n          \n          //cmult(cc3, ss3, x[i8], x[i4], t4, t3);\n          t4 = x[i8]*cc3 - x[i4]*ss3; \n          t3 = x[i8]*ss3 + x[i4]*cc3;\n       \n          //sumdiff(t2, t4);   // {a, b} <--| {a+b, a-b}\n          st1 = t2 - t4;\n          t2 += t4;\n          t4 = st1;\n          \n          //sumdiff(t2, x[i6], x[i8], x[i3]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i6]; x[i8] = t2 + st1; x[i3] = t2 - st1;\n          x[i8] = t2 + x[i6]; \n          x[i3] = t2 - x[i6];\n         \n          //sumdiff_r(t1, t3); // {a, b} <--| {a+b, b-a}\n          st1 = t3 - t1;\n          t1 += t3;\n          t3 = st1;\n          \n          //sumdiff(t3, x[i2], x[i4], x[i7]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i2]; x[i4] = t3 + st1; x[i7] = t3 - st1;\n          x[i4] = t3 + x[i2]; \n          x[i7] = t3 - x[i2];\n         \n          //sumdiff3(x[i1], t1, x[i6]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i6] = x[i1] - t1; \n          x[i1] += t1;\n          \n          //diffsum3_r(t4, x[i5], x[i2]); // {a, b, s} <--| {a, b-a, a+b}\n          x[i2] = t4 + x[i5]; \n          x[i5] -= t4;\n        }\n     \n        ix = (id << 1) - n2;\n        id = id << 2;\n   \n      } while (ix < n);\n    }\n  }\n\n  while (--i) {\n    rval = x[i];\n    ival = x[n-i-1];\n    mag = bSi * sqrt(rval * rval + ival * ival);\n\n    if (mag > this.peak) {\n      this.peakBand = i;\n      this.peak = mag;\n    }\n\n    spectrum[i] = mag;\n  }\n\n  spectrum[0] = bSi * x[0];\n\n  return spectrum;\n};\n\nfunction Sampler(file, bufferSize, sampleRate, playStart, playEnd, loopStart, loopEnd, loopMode) {\n  this.file = file;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.playStart  = playStart || 0; // 0%\n  this.playEnd    = playEnd   || 1; // 100%\n  this.loopStart  = loopStart || 0;\n  this.loopEnd    = loopEnd   || 1;\n  this.loopMode   = loopMode  || DSP.OFF;\n  this.loaded     = false;\n  this.samples    = [];\n  this.signal     = new Float32Array(bufferSize);\n  this.frameCount = 0;\n  this.envelope   = null;\n  this.amplitude  = 1;\n  this.rootFrequency = 110; // A2 110\n  this.frequency  = 550;\n  this.step       = this.frequency / this.rootFrequency;\n  this.duration   = 0;\n  this.samplesProcessed = 0;\n  this.playhead   = 0;\n \n  var audio = /* new Audio();*/ document.createElement(\"AUDIO\");\n  var self = this;\n \n  this.loadSamples = function(event) {\n    var buffer = DSP.getChannel(DSP.MIX, event.frameBuffer);\n    for ( var i = 0; i < buffer.length; i++) {\n      self.samples.push(buffer[i]);\n    }\n  };\n \n  this.loadComplete = function() {\n    // convert flexible js array into a fast typed array\n    self.samples = new Float32Array(self.samples);\n    self.loaded = true;\n  };\n \n  this.loadMetaData = function() {\n    self.duration = audio.duration;\n  };\n \n  audio.addEventListener(\"MozAudioAvailable\", this.loadSamples, false);\n  audio.addEventListener(\"loadedmetadata\", this.loadMetaData, false);\n  audio.addEventListener(\"ended\", this.loadComplete, false);\n  audio.muted = true;\n  audio.src = file;\n  audio.play();\n}\n\nSampler.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n  return this.signal;\n};\n\nSampler.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n \n  var loopWidth = this.playEnd * this.samples.length - this.playStart * this.samples.length;\n  var playStartSamples = this.playStart * this.samples.length; // ie 0.5 -> 50% of the length\n  var playEndSamples = this.playEnd * this.samples.length; // ie 0.5 -> 50% of the length\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    switch (this.loopMode) {\n      case DSP.OFF:\n        this.playhead = Math.round(this.samplesProcessed * this.step + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        } else {\n          this.signal[i] = 0;\n        }\n        break;\n     \n      case DSP.FW:\n        this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.BW:\n        this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.FWBW:\n        if ( Math.floor(this.samplesProcessed * this.step / loopWidth) % 2 === 0 ) {\n          this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        } else {\n          this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        }  \n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n    }\n    this.samplesProcessed++;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nSampler.prototype.setFreq = function(frequency) {\n    var totalProcessed = this.samplesProcessed * this.step;\n    this.frequency = frequency;\n    this.step = this.frequency / this.rootFrequency;\n    this.samplesProcessed = Math.round(totalProcessed/this.step);\n};\n\nSampler.prototype.reset = function() {\n  this.samplesProcessed = 0;\n  this.playhead = 0;\n};\n\n/**\n * Oscillator class for generating and modifying signals\n *\n * @param {Number} type       A waveform constant (eg. DSP.SINE)\n * @param {Number} frequency  Initial frequency of the signal\n * @param {Number} amplitude  Initial amplitude of the signal\n * @param {Number} bufferSize Size of the sample buffer to generate\n * @param {Number} sampleRate The sample rate of the signal\n *\n * @contructor\n */\nfunction Oscillator(type, frequency, amplitude, bufferSize, sampleRate) {\n  this.frequency  = frequency;\n  this.amplitude  = amplitude;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  //this.pulseWidth = pulseWidth;\n  this.frameCount = 0;\n \n  this.waveTableLength = 2048;\n\n  this.cyclesPerSample = frequency / sampleRate;\n\n  this.signal = new Float32Array(bufferSize);\n  this.envelope = null;\n\n  switch(parseInt(type, 10)) {\n    case DSP.TRIANGLE:\n      this.func = Oscillator.Triangle;\n      break;\n\n    case DSP.SAW:\n      this.func = Oscillator.Saw;\n      break;\n\n    case DSP.SQUARE:\n      this.func = Oscillator.Square;\n      break;\n\n    default:\n    case DSP.SINE:\n      this.func = Oscillator.Sine;\n      break;\n  }\n\n  this.generateWaveTable = function() {\n    Oscillator.waveTable[this.func] = new Float32Array(2048);\n    var waveTableTime = this.waveTableLength / this.sampleRate;\n    var waveTableHz = 1 / waveTableTime;\n\n    for (var i = 0; i < this.waveTableLength; i++) {\n      Oscillator.waveTable[this.func][i] = this.func(i * waveTableHz/this.sampleRate);\n    }\n  };\n\n  if ( typeof Oscillator.waveTable === 'undefined' ) {\n    Oscillator.waveTable = {};\n  }\n\n  if ( typeof Oscillator.waveTable[this.func] === 'undefined' ) {\n    this.generateWaveTable();\n  }\n \n  this.waveTable = Oscillator.waveTable[this.func];\n}\n\n/**\n * Set the amplitude of the signal\n *\n * @param {Number} amplitude The amplitude of the signal (between 0 and 1)\n */\nOscillator.prototype.setAmp = function(amplitude) {\n  if (amplitude >= 0 && amplitude <= 1) {\n    this.amplitude = amplitude;\n  } else {\n    throw \"Amplitude out of range (0..1).\";\n  }\n};\n  \n/**\n * Set the frequency of the signal\n *\n * @param {Number} frequency The frequency of the signal\n */  \nOscillator.prototype.setFreq = function(frequency) {\n  this.frequency = frequency;\n  this.cyclesPerSample = frequency / this.sampleRate;\n};\n     \n// Add an oscillator\nOscillator.prototype.add = function(oscillator) {\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //this.signal[i] += oscillator.valueAt(i);\n    this.signal[i] += oscillator.signal[i];\n  }\n \n  return this.signal;\n};\n     \n// Add a signal to the current generated osc signal\nOscillator.prototype.addSignal = function(signal) {\n  for ( var i = 0; i < signal.length; i++ ) {\n    if ( i >= this.bufferSize ) {\n      break;\n    }\n    this.signal[i] += signal[i];\n   \n    /*\n    // Constrain amplitude\n    if ( this.signal[i] > 1 ) {\n      this.signal[i] = 1;\n    } else if ( this.signal[i] < -1 ) {\n      this.signal[i] = -1;\n    }\n    */\n  }\n  return this.signal;\n};\n     \n// Add an envelope to the oscillator\nOscillator.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nOscillator.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n};\n     \nOscillator.prototype.valueAt = function(offset) {\n  return this.waveTable[offset % this.waveTableLength];\n};\n     \nOscillator.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n  var step = this.waveTableLength * this.frequency / this.sampleRate;\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //var step = (frameOffset + i) * this.cyclesPerSample % 1;\n    //this.signal[i] = this.func(step) * this.amplitude;\n    //this.signal[i] = this.valueAt(Math.round((frameOffset + i) * step)) * this.amplitude;\n    offset = Math.round((frameOffset + i) * step);\n    this.signal[i] = this.waveTable[offset % this.waveTableLength] * this.amplitude;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nOscillator.Sine = function(step) {\n  return Math.sin(DSP.TWO_PI * step);\n};\n\nOscillator.Square = function(step) {\n  return step < 0.5 ? 1 : -1;\n};\n\nOscillator.Saw = function(step) {\n  return 2 * (step - Math.round(step));\n};\n\nOscillator.Triangle = function(step) {\n  return 1 - 4 * Math.abs(Math.round(step) - step);\n};\n\nOscillator.Pulse = function(step) {\n  // stub\n};\n \nfunction ADSR(attackLength, decayLength, sustainLevel, sustainLength, releaseLength, sampleRate) {\n  this.sampleRate = sampleRate;\n  // Length in seconds\n  this.attackLength  = attackLength;\n  this.decayLength   = decayLength;\n  this.sustainLevel  = sustainLevel;\n  this.sustainLength = sustainLength;\n  this.releaseLength = releaseLength;\n  this.sampleRate    = sampleRate;\n \n  // Length in samples\n  this.attackSamples  = attackLength  * sampleRate;\n  this.decaySamples   = decayLength   * sampleRate;\n  this.sustainSamples = sustainLength * sampleRate;\n  this.releaseSamples = releaseLength * sampleRate;\n \n  // Updates the envelope sample positions\n  this.update = function() {\n    this.attack         =                this.attackSamples;\n    this.decay          = this.attack  + this.decaySamples;\n    this.sustain        = this.decay   + this.sustainSamples;\n    this.release        = this.sustain + this.releaseSamples;\n  };\n \n  this.update();\n \n  this.samplesProcessed = 0;\n}\n\nADSR.prototype.noteOn = function() {\n  this.samplesProcessed = 0;\n  this.sustainSamples = this.sustainLength * this.sampleRate;\n  this.update();\n};\n\n// Send a note off when using a sustain of infinity to let the envelope enter the release phase\nADSR.prototype.noteOff = function() {\n  this.sustainSamples = this.samplesProcessed - this.decaySamples;\n  this.update();\n};\n\nADSR.prototype.processSample = function(sample) {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return sample * amplitude;\n};\n\nADSR.prototype.value = function() {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return amplitude;\n};\n     \nADSR.prototype.process = function(buffer) {\n  for ( var i = 0; i < buffer.length; i++ ) {\n    buffer[i] *= this.value();\n\n    this.samplesProcessed++;\n  }\n \n  return buffer;\n};\n     \n     \nADSR.prototype.isActive = function() {\n  if ( this.samplesProcessed > this.release || this.samplesProcessed === -1 ) {\n    return false;\n  } else {\n    return true;\n  }\n};\n\nADSR.prototype.disable = function() {\n  this.samplesProcessed = -1;\n};\n \nfunction IIRFilter(type, cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n\n  switch(type) {\n    case DSP.LOWPASS:\n    case DSP.LP12:\n      this.func = new IIRFilter.LP12(cutoff, resonance, sampleRate);\n      break;\n  }\n}\n\nIIRFilter.prototype.__defineGetter__('cutoff',\n  function() {\n    return this.func.cutoff;\n  }\n);\n\nIIRFilter.prototype.__defineGetter__('resonance',\n  function() {\n    return this.func.resonance;\n  }\n);\n\nIIRFilter.prototype.set = function(cutoff, resonance) {\n  this.func.calcCoeff(cutoff, resonance);\n};\n\nIIRFilter.prototype.process = function(buffer) {\n  this.func.process(buffer);\n};\n\n// Add an envelope to the filter\nIIRFilter.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.func.addEnvelope(envelope);\n  } else {\n    throw \"Not an envelope.\";\n  }\n};\n\nIIRFilter.LP12 = function(cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n  this.vibraPos   = 0;\n  this.vibraSpeed = 0;\n  this.envelope = false;\n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.w = 2.0 * Math.PI * cutoff / this.sampleRate;\n    this.q = 1.0 - this.w / (2.0 * (resonance + 0.5 / (1.0 + this.w)) + this.w - 2.0);\n    this.r = this.q * this.q;\n    this.c = this.r + 1.0 - 2.0 * Math.cos(this.w) * this.q;\n   \n    this.cutoff = cutoff;\n    this.resonance = resonance;\n  };\n\n  this.calcCoeff(cutoff, resonance);\n\n  this.process = function(buffer) {\n    for ( var i = 0; i < buffer.length; i++ ) {\n      this.vibraSpeed += (buffer[i] - this.vibraPos) * this.c;\n      this.vibraPos   += this.vibraSpeed;\n      this.vibraSpeed *= this.r;\n   \n      /*\n      var temp = this.vibraPos;\n     \n      if ( temp > 1.0 ) {\n        temp = 1.0;\n      } else if ( temp < -1.0 ) {\n        temp = -1.0;\n      } else if ( temp != temp ) {\n        temp = 1;\n      }\n     \n      buffer[i] = temp;\n      */\n\n      if (this.envelope) {\n        buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (this.vibraPos * this.envelope.value());\n        this.envelope.samplesProcessed++;\n      } else {\n        buffer[i] = this.vibraPos;\n      }\n    }\n  };\n}; \n\nIIRFilter.LP12.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nfunction IIRFilter2(type, cutoff, resonance, sampleRate) {\n  this.type = type;\n  this.cutoff = cutoff;\n  this.resonance = resonance;\n  this.sampleRate = sampleRate;\n\n  this.f = Float32Array(4);\n  this.f[0] = 0.0; // lp\n  this.f[1] = 0.0; // hp\n  this.f[2] = 0.0; // bp\n  this.f[3] = 0.0; // br \n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.freq = 2 * Math.sin(Math.PI * Math.min(0.25, cutoff/(this.sampleRate*2)));  \n    this.damp = Math.min(2 * (1 - Math.pow(resonance, 0.25)), Math.min(2, 2/this.freq - this.freq * 0.5));\n  };\n\n  this.calcCoeff(cutoff, resonance);\n}\n\nIIRFilter2.prototype.process = function(buffer) {\n  var input, output;\n  var f = this.f;\n\n  for ( var i = 0; i < buffer.length; i++ ) {\n    input = buffer[i];\n\n    // first pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output = 0.5 * f[this.type];\n\n    // second pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output += 0.5 * f[this.type];\n\n    if (this.envelope) {\n      buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (output * this.envelope.value());\n      this.envelope.samplesProcessed++;\n    } else {\n      buffer[i] = output;\n    }\n  }\n};\n\nIIRFilter2.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.envelope = envelope;\n  } else {\n    throw \"This is not an envelope.\";\n  }\n};\n\nIIRFilter2.prototype.set = function(cutoff, resonance) {\n  this.calcCoeff(cutoff, resonance);\n};\n\n\n\nfunction WindowFunction(type, alpha) {\n  this.alpha = alpha;\n \n  switch(type) {\n    case DSP.BARTLETT:\n      this.func = WindowFunction.Bartlett;\n      break;\n     \n    case DSP.BARTLETTHANN:\n      this.func = WindowFunction.BartlettHann;\n      break;\n     \n    case DSP.BLACKMAN:\n      this.func = WindowFunction.Blackman;\n      this.alpha = this.alpha || 0.16;\n      break;\n   \n    case DSP.COSINE:\n      this.func = WindowFunction.Cosine;\n      break;\n     \n    case DSP.GAUSS:\n      this.func = WindowFunction.Gauss;\n      this.alpha = this.alpha || 0.25;\n      break;\n     \n    case DSP.HAMMING:\n      this.func = WindowFunction.Hamming;\n      break;\n     \n    case DSP.HANN:\n      this.func = WindowFunction.Hann;\n      break;\n   \n    case DSP.LANCZOS:\n      this.func = WindowFunction.Lanczoz;\n      break;\n     \n    case DSP.RECTANGULAR:\n      this.func = WindowFunction.Rectangular;\n      break;\n     \n    case DSP.TRIANGULAR:\n      this.func = WindowFunction.Triangular;\n      break;\n  }\n}\n\nWindowFunction.prototype.process = function(buffer) {\n  var length = buffer.length;\n  for ( var i = 0; i < length; i++ ) {\n    buffer[i] *= this.func(length, i, this.alpha);\n  }\n  return buffer;\n};\n\nWindowFunction.Bartlett = function(length, index) {\n  return 2 / (length - 1) * ((length - 1) / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nWindowFunction.BartlettHann = function(length, index) {\n  return 0.62 - 0.48 * Math.abs(index / (length - 1) - 0.5) - 0.38 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Blackman = function(length, index, alpha) {\n  var a0 = (1 - alpha) / 2;\n  var a1 = 0.5;\n  var a2 = alpha / 2;\n\n  return a0 - a1 * Math.cos(DSP.TWO_PI * index / (length - 1)) + a2 * Math.cos(4 * Math.PI * index / (length - 1));\n};\n\nWindowFunction.Cosine = function(length, index) {\n  return Math.cos(Math.PI * index / (length - 1) - Math.PI / 2);\n};\n\nWindowFunction.Gauss = function(length, index, alpha) {\n  return Math.pow(Math.E, -0.5 * Math.pow((index - (length - 1) / 2) / (alpha * (length - 1) / 2), 2));\n};\n\nWindowFunction.Hamming = function(length, index) {\n  return 0.54 - 0.46 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Hann = function(length, index) {\n  return 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));\n};\n\nWindowFunction.Lanczos = function(length, index) {\n  var x = 2 * index / (length - 1) - 1;\n  return Math.sin(Math.PI * x) / (Math.PI * x);\n};\n\nWindowFunction.Rectangular = function(length, index) {\n  return 1;\n};\n\nWindowFunction.Triangular = function(length, index) {\n  return 2 / length * (length / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nfunction sinh (arg) {\n  // Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2 \n  //\n  // version: 1004.2314\n  // discuss at: http://phpjs.org/functions/sinh    // +   original by: Onno Marsman\n  // *     example 1: sinh(-0.9834330348825909);\n  // *     returns 1: -1.1497971402636502\n  return (Math.exp(arg) - Math.exp(-arg))/2;\n}\n\n/* \n *  Biquad filter\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\n// Implementation based on:\n// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt\nfunction Biquad(type, sampleRate) {\n  this.Fs = sampleRate;\n  this.type = type;  // type of the filter\n  this.parameterType = DSP.Q; // type of the parameter\n\n  this.x_1_l = 0;\n  this.x_2_l = 0;\n  this.y_1_l = 0;\n  this.y_2_l = 0;\n\n  this.x_1_r = 0;\n  this.x_2_r = 0;\n  this.y_1_r = 0;\n  this.y_2_r = 0;\n\n  this.b0 = 1;\n  this.a0 = 1;\n\n  this.b1 = 0;\n  this.a1 = 0;\n\n  this.b2 = 0;\n  this.a2 = 0;\n\n  this.b0a0 = this.b0 / this.a0;\n  this.b1a0 = this.b1 / this.a0;\n  this.b2a0 = this.b2 / this.a0;\n  this.a1a0 = this.a1 / this.a0;\n  this.a2a0 = this.a2 / this.a0;\n\n  this.f0 = 3000;   // \"wherever it's happenin', man.\"  Center Frequency or\n                    // Corner Frequency, or shelf midpoint frequency, depending\n                    // on which filter type.  The \"significant frequency\".\n\n  this.dBgain = 12; // used only for peaking and shelving filters\n\n  this.Q = 1;       // the EE kind of definition, except for peakingEQ in which A*Q is\n                    // the classic EE Q.  That adjustment in definition was made so that\n                    // a boost of N dB followed by a cut of N dB for identical Q and\n                    // f0/Fs results in a precisely flat unity gain filter or \"wire\".\n\n  this.BW = -3;     // the bandwidth in octaves (between -3 dB frequencies for BPF\n                    // and notch or between midpoint (dBgain/2) gain frequencies for\n                    // peaking EQ\n\n  this.S = 1;       // a \"shelf slope\" parameter (for shelving EQ only).  When S = 1,\n                    // the shelf slope is as steep as it can be and remain monotonically\n                    // increasing or decreasing gain with frequency.  The shelf slope, in\n                    // dB/octave, remains proportional to S for all other values for a\n                    // fixed f0/Fs and dBgain.\n\n  this.coefficients = function() {\n    var b = [this.b0, this.b1, this.b2];\n    var a = [this.a0, this.a1, this.a2];\n    return {b: b, a:a};\n  };\n\n  this.setFilterType = function(type) {\n    this.type = type;\n    this.recalculateCoefficients();\n  };\n\n  this.setSampleRate = function(rate) {\n    this.Fs = rate;\n    this.recalculateCoefficients();\n  };\n\n  this.setQ = function(q) {\n    this.parameterType = DSP.Q;\n    this.Q = Math.max(Math.min(q, 115.0), 0.001);\n    this.recalculateCoefficients();\n  };\n\n  this.setBW = function(bw) {\n    this.parameterType = DSP.BW;\n    this.BW = bw;\n    this.recalculateCoefficients();\n  };\n\n  this.setS = function(s) {\n    this.parameterType = DSP.S;\n    this.S = Math.max(Math.min(s, 5.0), 0.0001);\n    this.recalculateCoefficients();\n  };\n\n  this.setF0 = function(freq) {\n    this.f0 = freq;\n    this.recalculateCoefficients();\n  }; \n \n  this.setDbGain = function(g) {\n    this.dBgain = g;\n    this.recalculateCoefficients();\n  };\n\n  this.recalculateCoefficients = function() {\n    var A;\n    if (type === DSP.PEAKING_EQ || type === DSP.LOW_SHELF || type === DSP.HIGH_SHELF ) {\n      A = Math.pow(10, (this.dBgain/40));  // for peaking and shelving EQ filters only\n    } else {\n      A  = Math.sqrt( Math.pow(10, (this.dBgain/20)) );   \n    }\n\n    var w0 = DSP.TWO_PI * this.f0 / this.Fs;\n\n    var cosw0 = Math.cos(w0);\n    var sinw0 = Math.sin(w0);\n\n    var alpha = 0;\n   \n    switch (this.parameterType) {\n      case DSP.Q:\n        alpha = sinw0/(2*this.Q);\n        break;\n           \n      case DSP.BW:\n        alpha = sinw0 * sinh( Math.LN2/2 * this.BW * w0/sinw0 );\n        break;\n\n      case DSP.S:\n        alpha = sinw0/2 * Math.sqrt( (A + 1/A)*(1/this.S - 1) + 2 );\n        break;\n    }\n\n    /**\n        FYI: The relationship between bandwidth and Q is\n             1/Q = 2*sinh(ln(2)/2*BW*w0/sin(w0))     (digital filter w BLT)\n        or   1/Q = 2*sinh(ln(2)/2*BW)             (analog filter prototype)\n\n        The relationship between shelf slope and Q is\n             1/Q = sqrt((A + 1/A)*(1/S - 1) + 2)\n    */\n\n    var coeff;\n\n    switch (this.type) {\n      case DSP.LPF:       // H(s) = 1 / (s^2 + s/Q + 1)\n        this.b0 =  (1 - cosw0)/2;\n        this.b1 =   1 - cosw0;\n        this.b2 =  (1 - cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.HPF:       // H(s) = s^2 / (s^2 + s/Q + 1)\n        this.b0 =  (1 + cosw0)/2;\n        this.b1 = -(1 + cosw0);\n        this.b2 =  (1 + cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_SKIRT:       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\n        this.b0 =   sinw0/2;\n        this.b1 =   0;\n        this.b2 =  -sinw0/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_PEAK:       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\n        this.b0 =   alpha;\n        this.b1 =   0;\n        this.b2 =  -alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.NOTCH:     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.APF:       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1 - alpha;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 + alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.PEAKING_EQ:  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\n        this.b0 =   1 + alpha*A;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 - alpha*A;\n        this.a0 =   1 + alpha/A;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha/A;\n        break;\n\n      case DSP.LOW_SHELF:   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) - (A-1)*cosw0 + coeff);\n        this.b1 =  2*A*((A-1) - (A+1)*cosw0);\n        this.b2 =    A*((A+1) - (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) + (A-1)*cosw0 + coeff;\n        this.a1 =   -2*((A-1) + (A+1)*cosw0);\n        this.a2 =       (A+1) + (A-1)*cosw0 - coeff;\n        break;\n\n      case DSP.HIGH_SHELF:   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) + (A-1)*cosw0 + coeff);\n        this.b1 = -2*A*((A-1) + (A+1)*cosw0);\n        this.b2 =    A*((A+1) + (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) - (A-1)*cosw0 + coeff;\n        this.a1 =    2*((A-1) - (A+1)*cosw0);\n        this.a2 =       (A+1) - (A-1)*cosw0 - coeff;\n        break;\n    }\n   \n    this.b0a0 = this.b0/this.a0;\n    this.b1a0 = this.b1/this.a0;\n    this.b2a0 = this.b2/this.a0;\n    this.a1a0 = this.a1/this.a0;\n    this.a2a0 = this.a2/this.a0;\n  };\n\n  this.process = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n\n      for ( var i=0; i<buffer.length; i++ ) {\n        output[i] = this.b0a0*buffer[i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[i];\n      }\n\n      return output;\n  };\n\n  this.processStereo = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n     \n      for (var i = 0; i < len/2; i++) {\n        output[2*i] = this.b0a0*buffer[2*i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[2*i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[2*i];\n\n        output[2*i+1] = this.b0a0*buffer[2*i+1] + this.b1a0*this.x_1_r + this.b2a0*this.x_2_r - this.a1a0*this.y_1_r - this.a2a0*this.y_2_r;\n        this.y_2_r = this.y_1_r;\n        this.y_1_r = output[2*i+1];\n        this.x_2_r = this.x_1_r;\n        this.x_1_r = buffer[2*i+1];\n      }\n\n      return output;\n  };\n}\n\n/* \n *  Magnitude to decibels\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  @buffer array of magnitudes to convert to decibels\n *\n *  @returns the array in decibels\n *\n */\nDSP.mag2db = function(buffer) {\n  var minDb = -120;\n  var minMag = Math.pow(10.0, minDb / 20.0);\n\n  var log = Math.log;\n  var max = Math.max;\n \n  var result = Float32Array(buffer.length);\n  for (var i=0; i<buffer.length; i++) {\n    result[i] = 20.0*log(max(buffer[i], minMag));\n  }\n\n  return result;\n};\n\n/* \n *  Frequency response\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  Calculates the frequency response at the given points.\n *\n *  @b b coefficients of the filter\n *  @a a coefficients of the filter\n *  @w w points (normally between -PI and PI) where to calculate the frequency response\n *\n *  @returns the frequency response in magnitude\n *\n */\nDSP.freqz = function(b, a, w) {\n  var i, j;\n\n  if (!w) {\n    w = Float32Array(200);\n    for (i=0;i<w.length; i++) {\n      w[i] = DSP.TWO_PI/w.length * i - Math.PI;\n    }\n  }\n\n  var result = Float32Array(w.length);\n \n  var sqrt = Math.sqrt;\n  var cos = Math.cos;\n  var sin = Math.sin;\n \n  for (i=0; i<w.length; i++) {\n    var numerator = {real:0.0, imag:0.0};\n    for (j=0; j<b.length; j++) {\n      numerator.real += b[j] * cos(-j*w[i]);\n      numerator.imag += b[j] * sin(-j*w[i]);\n    }\n\n    var denominator = {real:0.0, imag:0.0};\n    for (j=0; j<a.length; j++) {\n      denominator.real += a[j] * cos(-j*w[i]);\n      denominator.imag += a[j] * sin(-j*w[i]);\n    }\n \n    result[i] =  sqrt(numerator.real*numerator.real + numerator.imag*numerator.imag) / sqrt(denominator.real*denominator.real + denominator.imag*denominator.imag);\n  }\n\n  return result;\n};\n\n/* \n *  Graphical Equalizer\n *\n *  Implementation of a graphic equalizer with a configurable bands-per-octave\n *  and minimum and maximum frequencies\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\nfunction GraphicalEq(sampleRate) {\n  this.FS = sampleRate;\n  this.minFreq = 40.0;\n  this.maxFreq = 16000.0;\n\n  this.bandsPerOctave = 1.0;\n\n  this.filters = [];\n  this.freqzs = [];\n\n  this.calculateFreqzs = true;\n\n  this.recalculateFilters = function() {\n    var bandCount = Math.round(Math.log(this.maxFreq/this.minFreq) * this.bandsPerOctave/ Math.LN2);\n\n    this.filters = [];\n    for (var i=0; i<bandCount; i++) {\n      var freq = this.minFreq*(Math.pow(2, i/this.bandsPerOctave));\n      var newFilter = new Biquad(DSP.PEAKING_EQ, this.FS);\n      newFilter.setDbGain(0);\n      newFilter.setBW(1/this.bandsPerOctave);\n      newFilter.setF0(freq);\n      this.filters[i] = newFilter;\n      this.recalculateFreqz(i);\n    }\n  };\n\n  this.setMinimumFrequency = function(freq) {\n    this.minFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setMaximumFrequency = function(freq) {\n    this.maxFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setBandsPerOctave = function(bands) {\n    this.bandsPerOctave = bands;\n    this.recalculateFilters();\n  };\n\n  this.setBandGain = function(bandIndex, gain) {\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds.\";\n    }\n\n    if (!gain) {\n      throw \"A gain must be passed.\";\n    }\n   \n    this.filters[bandIndex].setDbGain(gain);\n    this.recalculateFreqz(bandIndex);\n  };\n \n  this.recalculateFreqz = function(bandIndex) {\n    if (!this.calculateFreqzs) {\n      return;\n    }\n\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds. \" + bandIndex + \" is out of [\" + 0 + \", \" + this.filters.length-1 + \"]\";\n    }\n       \n    if (!this.w) {\n      this.w = Float32Array(400);\n      for (var i=0; i<this.w.length; i++) {\n         this.w[i] = Math.PI/this.w.length * i;\n      }\n    }\n   \n    var b = [this.filters[bandIndex].b0, this.filters[bandIndex].b1, this.filters[bandIndex].b2];\n    var a = [this.filters[bandIndex].a0, this.filters[bandIndex].a1, this.filters[bandIndex].a2];\n\n    this.freqzs[bandIndex] = DSP.mag2db(DSP.freqz(b, a, this.w));\n  };\n\n  this.process = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].process(output);\n    }\n\n    return output;\n  };\n\n  this.processStereo = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].processStereo(output);\n    }\n\n    return output;\n  };\n}\n\n/**\n * MultiDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/delay-firefox-audio-api/\n *\n * This is a delay that feeds it's own delayed signal back into its circular\n * buffer. Also known as a CombFilter.\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\nfunction MultiDelay(maxDelayInSamplesSize, delayInSamples, masterVolume, delayVolume) {\n  this.delayBufferSamples   = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer     = delayInSamples;\n  this.delayOutputPointer   = 0;\n \n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.delayVolume     = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nMultiDelay.prototype.setDelayInSamples = function (delayInSamples) {\n  this.delayInSamples = delayInSamples;\n \n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setMasterVolume = function(masterVolume) {\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the delay feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and adds the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nMultiDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = (this.delayBufferSamples[this.delayOutputPointer] === null ? 0.0 : this.delayBufferSamples[this.delayOutputPointer]);\n   \n    // Mix normal audio data with delayed audio\n    var sample = (delaySample * this.delayVolume) + samples[i];\n   \n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = sample;\n   \n    // Return the audio with delay mix\n    outputSamples[i] = sample * this.masterVolume;\n   \n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * SingleDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: See usage in Reverb class\n *\n * This is a delay that does NOT feeds it's own delayed signal back into its \n * circular buffer, neither does it return the original signal. Also known as\n * an AllPassFilter(?).\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\n\nfunction SingleDelay(maxDelayInSamplesSize, delayInSamples, delayVolume) {\n  this.delayBufferSamples = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer  = delayInSamples;\n  this.delayOutputPointer = 0;\n \n  this.delayInSamples     = delayInSamples;\n  this.delayVolume        = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nSingleDelay.prototype.setDelayInSamples = function(delayInSamples) {\n  this.delayInSamples = delayInSamples;\n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the return signal volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nSingleDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and\n * returns the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nSingleDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n\n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = samples[i];\n   \n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = this.delayBufferSamples[this.delayOutputPointer];\n\n    // Return the audio with delay mix\n    outputSamples[i] = delaySample * this.delayVolume;\n\n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * Reverb effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/reverb-firefox-audio-api/\n *\n * This reverb consists of 6 SingleDelays, 6 MultiDelays and an IIRFilter2\n * for each of the two stereo channels.\n *\n * Compatible with interleaved stereo buffers only!\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffers)\n * @param {Number} delayInSamples Initial delay in samples for internal (Single/Multi)delays\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} mixVolume Initial reverb signal mix volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume for internal (Single/Multi)delays. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} dampFrequency Initial low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n *\n * @constructor\n */\nfunction Reverb(maxDelayInSamplesSize, delayInSamples, masterVolume, mixVolume, delayVolume, dampFrequency) {\n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.mixVolume       = mixVolume;\n  this.delayVolume     = delayVolume;\n  this.dampFrequency     = dampFrequency;\n \n  this.NR_OF_MULTIDELAYS = 6;\n  this.NR_OF_SINGLEDELAYS = 6;\n \n  this.LOWPASSL = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n  this.LOWPASSR = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n \n  this.singleDelays = [];\n  \n  var i, delayMultiply;\n\n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i] = new SingleDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.delayVolume);\n  }\n \n  this.multiDelays = [];\n\n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2... \n    this.multiDelays[i] = new MultiDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.masterVolume, this.delayVolume);\n  }\n}\n\n/**\n * Change the delay time in samples as a base for all delays.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nReverb.prototype.setDelayInSamples = function (delayInSamples){\n  this.delayInSamples = delayInSamples;\n\n  var i, delayMultiply;\n \n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n   \n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2...\n    this.multiDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMasterVolume = function (masterVolume){\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the reverb signal mix level.\n *\n * @param {Number} mixVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMixVolume = function (mixVolume){\n  this.mixVolume = mixVolume;\n};\n\n/**\n * Change all delays feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setDelayVolume = function (delayVolume){\n  this.delayVolume = delayVolume;\n \n  var i;\n\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    this.singleDelays[i].setDelayVolume(this.delayVolume);\n  } \n \n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    this.multiDelays[i].setDelayVolume(this.delayVolume);\n  } \n};\n\n/**\n * Change the Low Pass filter frequency.\n *\n * @param {Number} dampFrequency low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n */\nReverb.prototype.setDampFrequency = function (dampFrequency){\n  this.dampFrequency = dampFrequency;\n \n  this.LOWPASSL.set(dampFrequency, 0);\n  this.LOWPASSR.set(dampFrequency, 0); \n};\n\n/**\n * Process a given interleaved float value Array and copies and adds the reverb signal.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved buffer.\n */\nReverb.prototype.process = function (interleavedSamples){ \n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(interleavedSamples.length);\n \n  // Perform low pass on the input samples to mimick damp\n  var leftRightMix = DSP.deinterleave(interleavedSamples);\n  this.LOWPASSL.process( leftRightMix[DSP.LEFT] );\n  this.LOWPASSR.process( leftRightMix[DSP.RIGHT] ); \n  var filteredSamples = DSP.interleave(leftRightMix[DSP.LEFT], leftRightMix[DSP.RIGHT]);\n\n  var i;\n\n  // Process MultiDelays in parallel\n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    // Invert the signal of every even multiDelay\n    outputSamples = DSP.mixSampleBuffers(outputSamples, this.multiDelays[i].process(filteredSamples), 2%i === 0, this.NR_OF_MULTIDELAYS);\n  }\n \n  // Process SingleDelays in series\n  var singleDelaySamples = new Float32Array(outputSamples.length);\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    // Invert the signal of every even singleDelay\n    singleDelaySamples = DSP.mixSampleBuffers(singleDelaySamples, this.singleDelays[i].process(outputSamples), 2%i === 0, 1);\n  }\n\n  // Apply the volume of the reverb signal\n  for (i = 0; i<singleDelaySamples.length; i++) {\n    singleDelaySamples[i] *= this.mixVolume;\n  }\n \n  // Mix the original signal with the reverb signal\n  outputSamples = DSP.mixSampleBuffers(singleDelaySamples, interleavedSamples, 0, 1);\n\n  // Apply the master volume to the complete signal\n  for (i = 0; i<outputSamples.length; i++) {\n    outputSamples[i] *= this.masterVolume;\n  }\n   \n  return outputSamples;\n};\n\n"
  },
  {
    "path": "Downsample/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "Downsample/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "Downsample/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "Downsample/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Downsample/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "Downsample/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Downsample/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "Downsample/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "Downsample/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "Downsample/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "Isosurface/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Isosurface/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "Isosurface/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "Isosurface/experiment.txt",
    "content": "\nMethod:  tested each algorithm on 65^3 grid.  Plotted the function\n\n  sin(omega * x) + sin(omega * y) + sin(omega * z)\n\nin the range [-pi/2, pi/2] x [-pi/2, pi/2] x [-pi/2, pi/2]\n\nTo control for garbage collection and other unpredictable run time events, each run was repeated 100x to get an averaged measurement.\n\nAlso, since v8 has a JIT, we ran each method on a grid initialized with omega = 5 for 100 iterations in an attempt to trigger v8's optimizer.\n\nMeasurements were taken on my laptop:\n\n  node.js version: 0.6.14\n  Linux Mint 12\n  CPU: Intel Core2 Duo P8700 @ 2.53GHz\n  RAM: 4 GB\n\nFirst column is omega, second column is time taken.  All measurements are in milliseconds (ms)\n\nmc:\n\n0, 29.93\n1, 43.62\n2, 61.48\n3, 93.31\n4, 138.2\n5, 145.8\n6, 186.0\n7, 213.2\n8, 255.9\n9, 272.1\n10, 274.6\n\n\n\n\nsn (no precalc):\n\n0, 26.79\n1, 33.95\n2, 44.87\n3, 54.74\n4, 59.81\n5, 86.61\n6, 98.45\n7, 114.5\n8, 131.2\n9, 131.0\n10, 147.7\n\n\n\n\n\nsn (w/ edge precalculation):\n\n0, 24.06\n1, 29.42\n2, 37.78\n3, 47.72\n4, 51.36\n5, 74.54\n6, 83.99\n7, 97.34\n8, 112.4\n9, 109.2\n10, 124.3\n\n\n\nmt (NOTE: Number of iterations was reduced to 20 in order to get benchmark to complete in a reasonable time):\n\n0, 57\n1, 171\n2, 250\n3, 392\n4, 510\n5, 620\n6, 784\n7, 922\n8, 1070\n9, 1220\n10, 1420\n\n\n\n\n\n\nMesh sizes:\n\nvertices/faces:\n\n\nsn:\n\n0, 0\n7759, 7569\n15261, 14513\n23247, 22695\n30590, 29132\n38627, 37749\n45957, 43861\n53899, 52755\n60978, 58304\n68991, 67665\n76193, 73133\n\n\n\nmc:\n\n0, 0\n31038, 15520\n61034, 30512\n93042, 46548\n122378, 61204\n154758, 77504\n184138, 92224\n216282, 108484\n244514, 122576\n277422, 139440\n306554, 154168\n\nmt:\n\n0, 0\n139770, 42701\n214610, 65071\n338766, 102805\n431466, 130840\n553458, 167781\n652046, 197603\n769878, 233265\n869174, 263474\n986538, 298725\n1087086, 329083\n\n\n\n"
  },
  {
    "path": "Isosurface/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Isosurface Toolbox</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\n\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n\n    <!--Mesh algorithms-->\n    <script src=\"js/marchingcubes.js\"></script>\n    <script src=\"js/marchingtetrahedra.js\"></script>\n    <script src=\"js/surfacenets.js\"></script>\n\n    <script src=\"js/perlinnoise.js\"></script>\n    <script src=\"js/testdata.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tIsosurface Algorithm Tester\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Input Data:</p>\n\t    <p><select id=\"datasource\"></select></p>\n\t    <p>Algorithm:</p>\n\t    <p><select id=\"mesher\"></select></p>\n\t    <p>Show facets: <input type=\"checkbox\" id=\"showfacets\" value=\"checked\" /></p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" value=\"checked\" /></p>\n\t    <p>Resolution: <input type=\"text\" id=\"resolution\" value=\"0\" /> </p>\n\t    <p>Vertex count: <input type=\"text\" id=\"vertcount\" value=\"0\" /> </p>\n\t    <p>Face count: <input type=\"text\" id=\"facecount\" value=\"0\" /> </p>\n\t    <p>(Approx.) Time:<input type=\"text\" id=\"meshtime\" value=\"0\" /> </p>\n\t  </div>\n\t</div>\n\n\t<script type=\"text/javascript\">\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControl;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\tvar meshers = {\n\t\t     'Marching Cubes': MarchingCubes\n\t\t  ,  'Marching Tetraheda' : MarchingTetrahedra\n\t    ,  'Naive Surface Nets': SurfaceNets\n\t\t};\n\t\tvar testdata = {};\n\n\t\tfunction updateMesh() {\n\n\t\t  scene.remove( surfacemesh );\n\t\t  scene.remove( wiremesh );\n\n      //Create surface mesh\n\t\t\tgeometry\t= new THREE.Geometry();\n\n\t\t  var mesher = meshers[ document.getElementById(\"mesher\").value ]\n\t\t    , field  = testdata[ document.getElementById(\"datasource\").value ]();\n\n\t\t  var start = (new Date()).getTime();\n      var result = mesher( field.data, field.dims );\n      var end = (new Date()).getTime();\n\n      //Update statistics\n      document.getElementById(\"resolution\").value = field.dims[0] + 'x' + field.dims[1] + 'x' + field.dims[2];\n      document.getElementById(\"vertcount\").value = result.vertices.length;\n      document.getElementById(\"facecount\").value = result.faces.length;\n      document.getElementById(\"meshtime\").value = (end - start) / 1000.0;\n\n      geometry.vertices.length = 0;\n      geometry.faces.length = 0;\n\n      for(var i=0; i<result.vertices.length; ++i) {\n        var v = result.vertices[i];\n        geometry.vertices.push(new THREE.Vector3(v[0], v[1], v[2]));\n      }\n\n      for(var i=0; i<result.faces.length; ++i) {\n        var f = result.faces[i];\n        if(f.length === 3) {\n          geometry.faces.push(new THREE.Face3(f[0], f[1], f[2]));\n        } else if(f.length === 4) {\n          geometry.faces.push(new THREE.Face4(f[0], f[1], f[2], f[3]));\n        } else {\n          //Polygon needs to be subdivided\n        }\n      }\n\n      var cb = new THREE.Vector3(), ab = new THREE.Vector3();\n      for (var i=0; i<geometry.faces.length; ++i) {\n        var f = geometry.faces[i];\n        var vA = geometry.vertices[f.a];\n        var vB = geometry.vertices[f.b];\n        var vC = geometry.vertices[f.c];\n        cb.sub(vC, vB);\n        ab.sub(vA, vB);\n        cb.crossSelf(ab);\n        cb.normalize();\n        if (result.faces[i].length == 3) {\n          f.normal.copy(cb)\n          continue;\n        }\n\n        // quad\n        if (cb.isZero()) {\n          // broken normal in the first triangle, let's use the second triangle\n          var vA = geometry.vertices[f.a];\n          var vB = geometry.vertices[f.c];\n          var vC = geometry.vertices[f.d];\n          cb.sub(vC, vB);\n          ab.sub(vA, vB);\n          cb.crossSelf(ab);\n          cb.normalize();\n        }\n        f.normal.copy(cb);\n      }\n\n      geometry.verticesNeedUpdate = true;\n      geometry.elementsNeedUpdate = true;\n      geometry.normalsNeedUpdate = true;\n\n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n\n\t\t\tvar material\t= new THREE.MeshNormalMaterial();\n\t\t\tsurfacemesh\t= new THREE.Mesh( geometry, material );\n\t\t\tsurfacemesh.doubleSided = true;\n\t\t\tvar wirematerial = new THREE.MeshBasicMaterial({\n\t\t\t    color : 0xffffff\n\t\t\t  , wireframe : true\n\t\t\t});\n\t\t\twiremesh = new THREE.Mesh(geometry, wirematerial);\n\t\t\twiremesh.doubleSided = true;\n\t\t\tscene.add( surfacemesh );\n\t\t\tscene.add( wiremesh );\n\n      var bb = geometry.boundingBox;\n      wiremesh.position.x = surfacemesh.position.x = -(bb.max.x + bb.min.x) / 2.0;\n      wiremesh.position.y = surfacemesh.position.y = -(bb.max.y + bb.min.y) / 2.0;\n      wiremesh.position.z = surfacemesh.position.z = -(bb.max.z + bb.min.z) / 2.0;\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 40);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n\t\t\t// here you add your objects\n\t\t\t// - you will most likely replace this part by your own\n\t\t\tvar light\t= new THREE.AmbientLight( Math.random() * 0xffffff );\n\t\t\tscene.add( light );\n\t\t\tvar light\t= new THREE.DirectionalLight( Math.random() * 0xffffff );\n\t\t\tlight.position.set( Math.random(), Math.random(), Math.random() ).normalize();\n\t\t\tscene.add( light );\n\n\t\t\t//Initialize dom elements\n\t\t\ttestdata = createTestData();\n\t\t\tvar ds = document.getElementById(\"datasource\");\n\t\t\tfor(var id in testdata) {\n\t\t\t  ds.add(new Option(id, id), null);\n\t\t\t}\n\t\t\tds.onchange = updateMesh;\n\t\t\tvar ms = document.getElementById(\"mesher\");\n\t\t\tfor(var alg in meshers) {\n\t\t\t  ms.add(new Option(alg, alg), null);\n\t\t\t}\n\t\t\tms.onchange = updateMesh;\n\n\t\t\tdocument.getElementById(\"showfacets\").checked = true;\n\t\t\tdocument.getElementById(\"showedges\").checked  = true;\n\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      surfacemesh.visible = document.getElementById(\"showfacets\").checked;\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "Isosurface/js/benchmark.js",
    "content": "\nrequire('nodetime').profile();\n\nvar mesher = require(process.argv[2]).mesher\n  , res = parseInt(process.argv[3])\n  , max_freq = parseInt(process.argv[4])\n  , iter_count = parseInt(process.argv[5]);\n\nvar nr = 2*res + 1\n  , volume = new Float32Array(nr * nr * nr)\n  , dims   = new Int32Array([nr, nr, nr]);\n\nfunction init_volume(freq) {\n  var n = 0, s = 0.5 * freq * Math.PI / res;\n  for(var z=-res; z<=res; ++z)\n  for(var y=-res; y<=res; ++y)\n  for(var x=-res; x<=res; ++x, ++n) {\n    volume[n] = Math.sin(s * x) + Math.sin(s * y) + Math.sin(s * z);\n  }\n}\n\n//Warm up run on noisy volume, try to get JIT to compile meser\ninit_volume(res / 4.0);\nfor(var i=0; i<iter_count; ++i) {\n  mesher(volume, dims);\n}\n\n//Do iterations\nfor(var f = 0; f <= max_freq; ++f) {\n  init_volume(f);\n  var start = (new Date()).getTime();\n  for(var i=0; i<iter_count; ++i) {\n    mesher(volume, dims);\n  }\n  var end = (new Date()).getTime();\n  var mesh = mesher(volume, dims);\n  console.log(f + \", \" + ((end-start) / iter_count) + \", \" + mesh.vertices.length + \", \" + mesh.faces.length);  \n}\n\n"
  },
  {
    "path": "Isosurface/js/marchingcubes.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * Javascript Marching Cubes\n *\n * Based on Paul Bourke's classic implementation:\n *    http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * JS port by Mikola Lysenko\n */\n\nvar MarchingCubes = (function() {\nvar edgeTable= new Uint32Array([\n      0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n      0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n      0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n      0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n      0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n      0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n      0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n      0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n      0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n      0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n      0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n      0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n      0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n      0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n      0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n      0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n      0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n      0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n      0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n      0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n      0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n      0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n      0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n      0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n      0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n      0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n      0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n      0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n      0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n      0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n      0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n      0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   ])\n  , triTable = [\n      [],\n      [0, 8, 3],\n      [0, 1, 9],\n      [1, 8, 3, 9, 8, 1],\n      [1, 2, 10],\n      [0, 8, 3, 1, 2, 10],\n      [9, 2, 10, 0, 2, 9],\n      [2, 8, 3, 2, 10, 8, 10, 9, 8],\n      [3, 11, 2],\n      [0, 11, 2, 8, 11, 0],\n      [1, 9, 0, 2, 3, 11],\n      [1, 11, 2, 1, 9, 11, 9, 8, 11],\n      [3, 10, 1, 11, 10, 3],\n      [0, 10, 1, 0, 8, 10, 8, 11, 10],\n      [3, 9, 0, 3, 11, 9, 11, 10, 9],\n      [9, 8, 10, 10, 8, 11],\n      [4, 7, 8],\n      [4, 3, 0, 7, 3, 4],\n      [0, 1, 9, 8, 4, 7],\n      [4, 1, 9, 4, 7, 1, 7, 3, 1],\n      [1, 2, 10, 8, 4, 7],\n      [3, 4, 7, 3, 0, 4, 1, 2, 10],\n      [9, 2, 10, 9, 0, 2, 8, 4, 7],\n      [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n      [8, 4, 7, 3, 11, 2],\n      [11, 4, 7, 11, 2, 4, 2, 0, 4],\n      [9, 0, 1, 8, 4, 7, 2, 3, 11],\n      [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1],\n      [3, 10, 1, 3, 11, 10, 7, 8, 4],\n      [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4],\n      [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3],\n      [4, 7, 11, 4, 11, 9, 9, 11, 10],\n      [9, 5, 4],\n      [9, 5, 4, 0, 8, 3],\n      [0, 5, 4, 1, 5, 0],\n      [8, 5, 4, 8, 3, 5, 3, 1, 5],\n      [1, 2, 10, 9, 5, 4],\n      [3, 0, 8, 1, 2, 10, 4, 9, 5],\n      [5, 2, 10, 5, 4, 2, 4, 0, 2],\n      [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n      [9, 5, 4, 2, 3, 11],\n      [0, 11, 2, 0, 8, 11, 4, 9, 5],\n      [0, 5, 4, 0, 1, 5, 2, 3, 11],\n      [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5],\n      [10, 3, 11, 10, 1, 3, 9, 5, 4],\n      [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10],\n      [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3],\n      [5, 4, 8, 5, 8, 10, 10, 8, 11],\n      [9, 7, 8, 5, 7, 9],\n      [9, 3, 0, 9, 5, 3, 5, 7, 3],\n      [0, 7, 8, 0, 1, 7, 1, 5, 7],\n      [1, 5, 3, 3, 5, 7],\n      [9, 7, 8, 9, 5, 7, 10, 1, 2],\n      [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3],\n      [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2],\n      [2, 10, 5, 2, 5, 3, 3, 5, 7],\n      [7, 9, 5, 7, 8, 9, 3, 11, 2],\n      [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11],\n      [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7],\n      [11, 2, 1, 11, 1, 7, 7, 1, 5],\n      [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11],\n      [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0],\n      [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0],\n      [11, 10, 5, 7, 11, 5],\n      [10, 6, 5],\n      [0, 8, 3, 5, 10, 6],\n      [9, 0, 1, 5, 10, 6],\n      [1, 8, 3, 1, 9, 8, 5, 10, 6],\n      [1, 6, 5, 2, 6, 1],\n      [1, 6, 5, 1, 2, 6, 3, 0, 8],\n      [9, 6, 5, 9, 0, 6, 0, 2, 6],\n      [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n      [2, 3, 11, 10, 6, 5],\n      [11, 0, 8, 11, 2, 0, 10, 6, 5],\n      [0, 1, 9, 2, 3, 11, 5, 10, 6],\n      [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11],\n      [6, 3, 11, 6, 5, 3, 5, 1, 3],\n      [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6],\n      [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9],\n      [6, 5, 9, 6, 9, 11, 11, 9, 8],\n      [5, 10, 6, 4, 7, 8],\n      [4, 3, 0, 4, 7, 3, 6, 5, 10],\n      [1, 9, 0, 5, 10, 6, 8, 4, 7],\n      [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4],\n      [6, 1, 2, 6, 5, 1, 4, 7, 8],\n      [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7],\n      [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6],\n      [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n      [3, 11, 2, 7, 8, 4, 10, 6, 5],\n      [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11],\n      [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6],\n      [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6],\n      [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6],\n      [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11],\n      [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7],\n      [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n      [10, 4, 9, 6, 4, 10],\n      [4, 10, 6, 4, 9, 10, 0, 8, 3],\n      [10, 0, 1, 10, 6, 0, 6, 4, 0],\n      [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10],\n      [1, 4, 9, 1, 2, 4, 2, 6, 4],\n      [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4],\n      [0, 2, 4, 4, 2, 6],\n      [8, 3, 2, 8, 2, 4, 4, 2, 6],\n      [10, 4, 9, 10, 6, 4, 11, 2, 3],\n      [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6],\n      [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10],\n      [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1],\n      [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3],\n      [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1],\n      [3, 11, 6, 3, 6, 0, 0, 6, 4],\n      [6, 4, 8, 11, 6, 8],\n      [7, 10, 6, 7, 8, 10, 8, 9, 10],\n      [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10],\n      [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0],\n      [10, 6, 7, 10, 7, 1, 1, 7, 3],\n      [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7],\n      [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9],\n      [7, 8, 0, 7, 0, 6, 6, 0, 2],\n      [7, 3, 2, 6, 7, 2],\n      [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7],\n      [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7],\n      [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11],\n      [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1],\n      [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6],\n      [0, 9, 1, 11, 6, 7],\n      [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0],\n      [7, 11, 6],\n      [7, 6, 11],\n      [3, 0, 8, 11, 7, 6],\n      [0, 1, 9, 11, 7, 6],\n      [8, 1, 9, 8, 3, 1, 11, 7, 6],\n      [10, 1, 2, 6, 11, 7],\n      [1, 2, 10, 3, 0, 8, 6, 11, 7],\n      [2, 9, 0, 2, 10, 9, 6, 11, 7],\n      [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n      [7, 2, 3, 6, 2, 7],\n      [7, 0, 8, 7, 6, 0, 6, 2, 0],\n      [2, 7, 6, 2, 3, 7, 0, 1, 9],\n      [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6],\n      [10, 7, 6, 10, 1, 7, 1, 3, 7],\n      [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8],\n      [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7],\n      [7, 6, 10, 7, 10, 8, 8, 10, 9],\n      [6, 8, 4, 11, 8, 6],\n      [3, 6, 11, 3, 0, 6, 0, 4, 6],\n      [8, 6, 11, 8, 4, 6, 9, 0, 1],\n      [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6],\n      [6, 8, 4, 6, 11, 8, 2, 10, 1],\n      [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6],\n      [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9],\n      [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n      [8, 2, 3, 8, 4, 2, 4, 6, 2],\n      [0, 4, 2, 4, 6, 2],\n      [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8],\n      [1, 9, 4, 1, 4, 2, 2, 4, 6],\n      [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1],\n      [10, 1, 0, 10, 0, 6, 6, 0, 4],\n      [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3],\n      [10, 9, 4, 6, 10, 4],\n      [4, 9, 5, 7, 6, 11],\n      [0, 8, 3, 4, 9, 5, 11, 7, 6],\n      [5, 0, 1, 5, 4, 0, 7, 6, 11],\n      [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5],\n      [9, 5, 4, 10, 1, 2, 7, 6, 11],\n      [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5],\n      [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2],\n      [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n      [7, 2, 3, 7, 6, 2, 5, 4, 9],\n      [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7],\n      [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0],\n      [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8],\n      [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7],\n      [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4],\n      [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10],\n      [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n      [6, 9, 5, 6, 11, 9, 11, 8, 9],\n      [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5],\n      [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11],\n      [6, 11, 3, 6, 3, 5, 5, 3, 1],\n      [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6],\n      [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10],\n      [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5],\n      [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n      [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2],\n      [9, 5, 6, 9, 6, 0, 0, 6, 2],\n      [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8],\n      [1, 5, 6, 2, 1, 6],\n      [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6],\n      [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0],\n      [0, 3, 8, 5, 6, 10],\n      [10, 5, 6],\n      [11, 5, 10, 7, 5, 11],\n      [11, 5, 10, 11, 7, 5, 8, 3, 0],\n      [5, 11, 7, 5, 10, 11, 1, 9, 0],\n      [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1],\n      [11, 1, 2, 11, 7, 1, 7, 5, 1],\n      [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11],\n      [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7],\n      [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n      [2, 5, 10, 2, 3, 5, 3, 7, 5],\n      [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5],\n      [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2],\n      [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2],\n      [1, 3, 5, 3, 7, 5],\n      [0, 8, 7, 0, 7, 1, 1, 7, 5],\n      [9, 0, 3, 9, 3, 5, 5, 3, 7],\n      [9, 8, 7, 5, 9, 7],\n      [5, 8, 4, 5, 10, 8, 10, 11, 8],\n      [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0],\n      [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5],\n      [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4],\n      [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8],\n      [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11],\n      [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5],\n      [9, 4, 5, 2, 11, 3],\n      [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4],\n      [5, 10, 2, 5, 2, 4, 4, 2, 0],\n      [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9],\n      [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2],\n      [8, 4, 5, 8, 5, 3, 3, 5, 1],\n      [0, 4, 5, 1, 0, 5],\n      [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5],\n      [9, 4, 5],\n      [4, 11, 7, 4, 9, 11, 9, 10, 11],\n      [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11],\n      [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11],\n      [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4],\n      [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2],\n      [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3],\n      [11, 7, 4, 11, 4, 2, 2, 4, 0],\n      [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n      [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9],\n      [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7],\n      [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10],\n      [1, 10, 2, 8, 7, 4],\n      [4, 9, 1, 4, 1, 7, 7, 1, 3],\n      [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1],\n      [4, 0, 3, 7, 4, 3],\n      [4, 8, 7],\n      [9, 10, 8, 10, 11, 8],\n      [3, 0, 9, 3, 9, 11, 11, 9, 10],\n      [0, 1, 10, 0, 10, 8, 8, 10, 11],\n      [3, 1, 10, 11, 3, 10],\n      [1, 2, 11, 1, 11, 9, 9, 11, 8],\n      [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9],\n      [0, 2, 11, 8, 0, 11],\n      [3, 2, 11],\n      [2, 3, 8, 2, 8, 10, 10, 8, 9],\n      [9, 10, 2, 0, 9, 2],\n      [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8],\n      [1, 10, 2],\n      [1, 3, 8, 9, 1, 8],\n      [0, 9, 1],\n      [0, 3, 8],\n      []]\n  , cubeVerts = [\n     [0,0,0]\n    ,[1,0,0]\n    ,[1,1,0]\n    ,[0,1,0]\n    ,[0,0,1]\n    ,[1,0,1]\n    ,[1,1,1]\n    ,[0,1,1]]\n  , edgeIndex = [ [0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7] ];\n\nreturn function(data, dims) {\n  var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = new Int32Array(3);\n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //For each cell, compute cube mask\n    var cube_index = 0;\n    for(var i=0; i<8; ++i) {\n      var v = cubeVerts[i]\n        , s = data[n + v[0] + dims[0] * (v[1] + dims[1] * v[2])];\n      grid[i] = s;\n      cube_index |= (s > 0) ? 1 << i : 0;\n    }\n    //Compute vertices\n    var edge_mask = edgeTable[cube_index];\n    if(edge_mask === 0) {\n      continue;\n    }\n    for(var i=0; i<12; ++i) {\n      if((edge_mask & (1<<i)) === 0) {\n        continue;\n      }\n      edges[i] = vertices.length;\n      var nv = [0,0,0]\n        , e = edgeIndex[i]\n        , p0 = cubeVerts[e[0]]\n        , p1 = cubeVerts[e[1]]\n        , a = grid[e[0]]\n        , b = grid[e[1]]\n        , d = a - b\n        , t = 0;\n      if(Math.abs(d) > 1e-6) {\n        t = a / d;\n      }\n      for(var j=0; j<3; ++j) {\n        nv[j] = (x[j] + p0[j]) + t * (p1[j] - p0[j]);\n      }\n      vertices.push(nv);\n    }\n    //Add faces\n    var f = triTable[cube_index];\n    for(var i=0; i<f.length; i += 3) {\n      faces.push([edges[f[i]], edges[f[i+1]], edges[f[i+2]]]);\n    }\n  }\n  return { vertices: vertices, faces: faces };\n};\n})();\n\nif(exports) {\n  exports.mesher = MarchingCubes;\n}\n\n"
  },
  {
    "path": "Isosurface/js/marchingtetrahedra.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * Marching Tetrahedra in Javascript\n *\n * Based on Paul Bourke's implementation\n *  http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * (Several bug fixes were made to deal with oriented faces)\n *\n * Javascript port by Mikola Lysenko\n */\nvar MarchingTetrahedra = (function() {\nvar cube_vertices = [\n        [0,0,0]\n      , [1,0,0]\n      , [1,1,0]\n      , [0,1,0]\n      , [0,0,1]\n      , [1,0,1]\n      , [1,1,1]\n      , [0,1,1] ]\n  , tetra_list = [\n        [0,2,3,7]\n      , [0,6,2,7]\n      , [0,4,6,7]\n      , [0,6,1,2]\n      , [0,1,6,4]\n      , [5,6,1,4] ];\n\nreturn function(data, dims) {\n   \n   var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = [0,0,0];\n    \n  function interp(i0, i1) {\n    var g0 = grid[i0]\n      , g1 = grid[i1]\n      , p0 = cube_vertices[i0]\n      , p1 = cube_vertices[i1]\n      , v  = [x[0], x[1], x[2]]\n      , t = g0 - g1;\n    if(Math.abs(t) > 1e-6) {\n      t = g0 / t;\n    }\n    for(var i=0; i<3; ++i) {\n      v[i] += p0[i] + t * (p1[i] - p0[i]);\n    }\n    vertices.push(v);\n    return vertices.length - 1;\n  }\n  \n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //Read in cube  \n    for(var i=0; i<8; ++i) {\n      grid[i] = data[n + cube_vertices[i][0] + dims[0] * (cube_vertices[i][1] + dims[1] * cube_vertices[i][2])];\n    }\n    for(var i=0; i<tetra_list.length; ++i) {\n      var T = tetra_list[i]\n        , triindex = 0;\n      if (grid[T[0]] < 0) triindex |= 1;\n      if (grid[T[1]] < 0) triindex |= 2;\n      if (grid[T[2]] < 0) triindex |= 4;\n      if (grid[T[3]] < 0) triindex |= 8;\n      \n      //Handle each case\n      switch (triindex) {\n        case 0x00:\n        case 0x0F:\n        break;\n        case 0x0E:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[3]) \n            , interp(T[0], T[2]) ]);\n        break;\n        case 0x01:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[2])\n            , interp(T[0], T[3])  ]);\n        break;\n        case 0x0D:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[2]) \n            , interp(T[1], T[3]) ]);\n        break;\n        case 0x02:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[3])\n            , interp(T[1], T[2]) ]);\n        break;\n        case 0x0C:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[1], T[3])\n              , interp(T[0], T[3])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x03:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[0], T[2])\n              , interp(T[0], T[3])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x04:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[1])\n              , interp(T[2], T[3]) ]);\n        break;\n        case 0x0B:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[3]) \n              , interp(T[2], T[1]) ]);\n        break;\n        case 0x05:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[1], T[2])\n              , interp(T[2], T[3])\n              , interp(T[0], T[3]) ]);\n        break;\n        case 0x0A:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[0], T[3])\n              , interp(T[2], T[3])\n              , interp(T[1], T[2]) ]);\n        break;\n        case 0x06:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[0], T[2])\n              , interp(T[0], T[1])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x09:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[1], T[3])\n              , interp(T[0], T[1])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x07:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[1])\n              , interp(T[3], T[2]) ]);\n        break;\n        case 0x08:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[2])\n              , interp(T[3], T[1]) ]);\n        break;\n      }\n    }\n  }\n  \n  return { vertices: vertices, faces: faces };\n}\n})();\n\n\nif(exports) {\n  exports.mesher = MarchingTetrahedra;\n}\n"
  },
  {
    "path": "Isosurface/js/perlinnoise.js",
    "content": "\n//This code is from Kas Thomas' blog:\n//  http://asserttrue.blogspot.de/2011/12/perlin-noise-in-javascript_31.html\n\n// This is a port of Ken Perlin's Java code. The\n// original Java code is at http://cs.nyu.edu/%7Eperlin/noise/.\n// Note that in this version, a number from 0 to 1 is returned.\nPerlinNoise = new function() {\n\nthis.noise = function(x, y, z) {\n\n   var p = new Array(512)\n   var permutation = [ 151,160,137,91,90,15,\n   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n   ];\n   for (var i=0; i < 256 ; i++) \n p[256+i] = p[i] = permutation[i]; \n\n      var X = Math.floor(x) & 255,                  // FIND UNIT CUBE THAT\n          Y = Math.floor(y) & 255,                  // CONTAINS POINT.\n          Z = Math.floor(z) & 255;\n      x -= Math.floor(x);                                // FIND RELATIVE X,Y,Z\n      y -= Math.floor(y);                                // OF POINT IN CUBE.\n      z -= Math.floor(z);\n      var    u = fade(x),                                // COMPUTE FADE CURVES\n             v = fade(y),                                // FOR EACH OF X,Y,Z.\n             w = fade(z);\n      var A = p[X  ]+Y, AA = p[A]+Z, AB = p[A+1]+Z,      // HASH COORDINATES OF\n          B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;      // THE 8 CUBE CORNERS,\n\n      return scale(lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ),  // AND ADD\n                                     grad(p[BA  ], x-1, y  , z   )), // BLENDED\n                             lerp(u, grad(p[AB  ], x  , y-1, z   ),  // RESULTS\n                                     grad(p[BB  ], x-1, y-1, z   ))),// FROM  8\n                     lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  // CORNERS\n                                     grad(p[BA+1], x-1, y  , z-1 )), // OF CUBE\n                             lerp(u, grad(p[AB+1], x  , y-1, z-1 ),\n                                     grad(p[BB+1], x-1, y-1, z-1 )))));\n   }\n   function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n   function lerp( t, a, b) { return a + t * (b - a); }\n   function grad(hash, x, y, z) {\n      var h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE\n      var u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.\n             v = h<4 ? y : h==12||h==14 ? x : z;\n      return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);\n   } \n   function scale(n) { return (1 + n)/2; }\n}\n"
  },
  {
    "path": "Isosurface/js/surfacenets.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\nvar SurfaceNets = (function() {\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Int32Array(4096);\n\nreturn function(data, dims) {\n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = new Int32Array(3)\n    , R = new Int32Array([1, (dims[0]+1), (dims[0]+1)*(dims[1]+1)])\n    , grid = new Float32Array(8)\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    buffer = new Int32Array(R[2] * 2);\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { vertices: vertices, faces: faces };\n};\n})();\n"
  },
  {
    "path": "Isosurface/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function memoize(f) {\n    var cached = null;\n    return function() {\n      if(cached === null) { \n        cached = f();\n      }\n      return cached;\n    }\n  }\n  \n  function makeVolume(dims, f) {\n    return memoize(function() {\n      var res = new Array(3);\n      for(var i=0; i<3; ++i) {\n        res[i] = 2 + Math.ceil((dims[i][1] - dims[i][0]) / dims[i][2]);\n      }\n      var volume = new Float32Array(res[0] * res[1] * res[2])\n        , n = 0;\n      for(var k=0, z=dims[2][0]-dims[2][2]; k<res[2]; ++k, z+=dims[2][2])\n      for(var j=0, y=dims[1][0]-dims[1][2]; j<res[1]; ++j, y+=dims[1][2])\n      for(var i=0, x=dims[0][0]-dims[0][2]; i<res[0]; ++i, x+=dims[0][2], ++n) {\n        volume[n] = f(x,y,z);\n      }\n      return {data: volume, dims:res};\n    });\n  }\n\n  result['Sphere'] = makeVolume(\n    [[-1.0, 1.0, 0.25],\n     [-1.0, 1.0, 0.25],\n     [-1.0, 1.0, 0.25]],\n    function(x,y,z) {\n      return x*x + y*y + z*z - 1.0;\n    }\n  );\n  \n  result['Torus'] = makeVolume(\n    [[-2.0, 2.0, 0.2],\n     [-2.0, 2.0, 0.2],\n     [-1.0, 1.0, 0.2]],\n    function(x,y,z) {\n      return Math.pow(1.0 - Math.sqrt(x*x + y*y), 2) + z*z - 0.25;\n    }\n  );\n\n  result['Big Sphere'] = makeVolume(\n    [[-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05]],\n    function(x,y,z) {\n      return x*x + y*y + z*z - 1.0;\n    }\n  );\n  \n  result['Hyperelliptic'] = makeVolume(\n    [[-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05]],\n    function(x,y,z) {\n      return Math.pow( Math.pow(x, 6) + Math.pow(y, 6) + Math.pow(z, 6), 1.0/6.0 ) - 1.0;\n    }  \n  );\n  \n  result['Nodal Cubic'] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      return x*y + y*z + z*x + x*y*z;\n    }\n  );\n  \n  result[\"Goursat's Surface\"] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      return Math.pow(x,4) + Math.pow(y,4) + Math.pow(z,4) - 1.5 * (x*x  + y*y + z*z) + 1;\n    }\n  );\n  \n  result[\"Heart\"] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      y *= 1.5;\n      z *= 1.5;\n      return Math.pow(2*x*x+y*y+2*z*z-1, 3) - 0.1 * z*z*y*y*y - y*y*y*x*x;\n    }\n  );\n  \n  result[\"Nordstrand's Weird Surface\"] = makeVolume(\n    [[-0.8, 0.8, 0.01],\n     [-0.8, 0.8, 0.01],\n     [-0.8, 0.8, 0.01]],\n    function(x,y,z) {\n      return 25 * (Math.pow(x,3)*(y+z) + Math.pow(y,3)*(x+z) + Math.pow(z,3)*(x+y)) +\n        50 * (x*x*y*y + x*x*z*z + y*y*z*z) -\n        125 * (x*x*y*z + y*y*x*z+z*z*x*y) +\n        60*x*y*z -\n        4*(x*y+x*z+y*z);\n    }\n  );\n  \n  result['Sine Waves'] = makeVolume(\n    [[-Math.PI*2, Math.PI*2, Math.PI/8],\n     [-Math.PI*2, Math.PI*2, Math.PI/8],\n     [-Math.PI*2, Math.PI*2, Math.PI/8]],\n    function(x,y,z) {\n      return Math.sin(x) + Math.sin(y) + Math.sin(z);\n    }\n  );\n  \n  result['Perlin Noise'] = makeVolume(\n    [[-5, 5, 0.25],\n     [-5, 5, 0.25],\n     [-5, 5, 0.25]],\n    function(x,y,z) {\n      return PerlinNoise.noise(x,y,z) - 0.5;\n    }\n  );\n    \n  result['Asteroid'] = makeVolume(\n    [[-1, 1, 0.08],\n     [-1, 1, 0.08],\n     [-1, 1, 0.08]],\n    function(x,y,z) {\n      return (x*x + y*y + z*z) - PerlinNoise.noise(x*2,y*2,z*2);\n    }\n  );\n  \n  result['Terrain'] = makeVolume(\n    [[-1, 1, 0.05],\n     [-1, 1, 0.05],\n     [-1, 1, 0.05]],\n    function(x,y,z) {\n      return  y + PerlinNoise.noise(x*2+5,y*2+3,z*2+0.6);\n    }\n  );\n\n  function distanceFromConvexPlanes(planes, planeOffsets, x, y, z) {\n    var maxDistance = -Infinity;\n    for(var i = 0; i < planes.length; i++) {\n      var x_ = x - planeOffsets[i][0];\n      var y_ = y - planeOffsets[i][1];\n      var z_ = z - planeOffsets[i][2];\n\n      var dotProduct = planes[i][0] * x_ + planes[i][1] * y_ + planes[i][2] * z_;\n\n      maxDistance = Math.max(maxDistance, dotProduct);\n    }\n\n    return maxDistance;\n  }\n\n  result['Pyramid'] = makeVolume(\n    [[-1, 1, 0.125],\n     [-1, 1, 0.125],\n     [-1, 1, 0.125]],\n    function(x,y,z) {\n      var ROOT_3 = Math.sqrt(3);\n\n      var planes = [[-ROOT_3, ROOT_3, -ROOT_3],\n                    [-ROOT_3, ROOT_3,  ROOT_3],\n                    [ ROOT_3, ROOT_3, -ROOT_3],\n                    [ ROOT_3, ROOT_3,  ROOT_3]];\n      var planeOffsets = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]];\n\n      return distanceFromConvexPlanes(planes, planeOffsets, x, y, z);\n    }\n  );\n\n  result['1/2 Offset Pyramid'] = makeVolume(\n    [[-1, 1, 0.125],\n     [-1, 1, 0.125],\n     [-1, 1, 0.125]],\n    function(x,y,z) {\n      var ROOT_3 = Math.sqrt(3);\n\n      var planes = [[-ROOT_3, ROOT_3, -ROOT_3],\n                    [-ROOT_3, ROOT_3,  ROOT_3],\n                    [ ROOT_3, ROOT_3, -ROOT_3],\n                    [ ROOT_3, ROOT_3,  ROOT_3]];\n      var planeOffsets = [[0.0625, 0.0625, 0.0625],\n                          [0.0625, 0.0625, 0.0625],\n                          [0.0625, 0.0625, 0.0625],\n                          [0.0625,0.0625,0.0625]];\n\n      return distanceFromConvexPlanes(planes, planeOffsets, x, y, z);\n    }\n  );\n\n  result['Tetrahedron'] = makeVolume(\n    [[-1, 1, 0.125],\n     [-1, 1, 0.125],\n     [-1, 1, 0.125]],\n    function(x,y,z) {\n      var INV_ROOT_3 = Math.sqrt(3)/3;\n\n      var planes = [[ INV_ROOT_3,  INV_ROOT_3,  INV_ROOT_3],\n                    [-INV_ROOT_3, -INV_ROOT_3,  INV_ROOT_3],\n                    [ INV_ROOT_3, -INV_ROOT_3, -INV_ROOT_3],\n                    [-INV_ROOT_3,  INV_ROOT_3, -INV_ROOT_3]];\n      var planeOffsets = [[ 0.25,  0.25,  0.25],\n                          [-0.25, -0.25,  0.25],\n                          [ 0.25, -0.25, -0.25],\n                          [-0.25,  0.25, -0.25]];\n\n      return distanceFromConvexPlanes(planes, planeOffsets, x, y, z);\n    }\n  );\n\n  result['1/2 Offset Tetrahedron'] = makeVolume(\n    [[-1, 1, 0.125],\n     [-1, 1, 0.125],\n     [-1, 1, 0.125]],\n    function(x,y,z) {\n      var INV_ROOT_3 = Math.sqrt(3)/3;\n\n      var planes = [[ INV_ROOT_3,  INV_ROOT_3,  INV_ROOT_3],\n                    [-INV_ROOT_3, -INV_ROOT_3,  INV_ROOT_3],\n                    [ INV_ROOT_3, -INV_ROOT_3, -INV_ROOT_3],\n                    [-INV_ROOT_3,  INV_ROOT_3, -INV_ROOT_3]];\n      var planeOffsets = [[ 0.3125,  0.3125,  0.3125],\n                          [-0.3125, -0.3125,  0.3125],\n                          [ 0.3125, -0.3125, -0.3125],\n                          [-0.3125,  0.3125, -0.3125]];\n\n      return distanceFromConvexPlanes(planes, planeOffsets, x, y, z);\n    }\n  );\n  \n  result['Empty'] = function(){ return { data: new Float32Array(32*32*32), dims:[32,32,32] } };\n  \n  return result;\n}\n"
  },
  {
    "path": "Isosurface/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "Isosurface/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "Isosurface/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "Isosurface/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "Isosurface/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "Isosurface/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "Isosurface/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "Isosurface/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "Isosurface/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "Isosurface/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "LevelOfDetail/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "LevelOfDetail/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "LevelOfDetail/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "LevelOfDetail/js/boxfilter.js",
    "content": "\n//Naive box filter for downsampling volume\nfunction BoxFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n  \n    var s = 0.0;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0) {\n        iz = -iz;\n      }\n      if(iz >= dims[2]) {\n        iz = 2*dims[2]-2-iz;\n      }\n      \n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0) {\n          iy = -iy;\n        }\n        if(iy >= dims[1]) {\n          iy = 2*dims[1]-2-iy;\n        }\n        \n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0) {\n            ix = -ix;\n          }\n          if(ix >= dims[0]) {\n            ix = 2*dims[0]-2-ix;\n          }\n          s += volume[ix+dims[0]*(iy+dims[1]*(iz))] / (1 << (Math.abs(dx) + Math.abs(dy) + Math.abs(dz)));\n        }\n      }\n    }\n    nvolume[n++] = s / 8.0;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/closing.js",
    "content": "\n//Morophological closing filter\nfunction ClosingFilter(volume, dims) {\n  \"use strict\";\n  \n\n  //Dilate\n  var pvolume = new Float32Array(dims[0] * dims[1] * dims[2])\n    , n = 0;\n  for(var k=0; k<dims[2]; ++k)\n  for(var j=0; j<dims[1]; ++j)\n  for(var i=0; i<dims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    pvolume[n++] = s;\n  }\n  \n  //Erode and downsample\n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2]);\n  n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = 2*k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = 2*j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = 2*i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, pvolume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/marchingcubes.js",
    "content": "/**\n * Javascript Marching Cubes\n *\n * Based on Paul Bourke's classic implementation:\n *    http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * JS port by Mikola Lysenko\n */\n\nvar MarchingCubes = (function() {\nvar edgeTable= new Uint32Array([\n      0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n      0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n      0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n      0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n      0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n      0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n      0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n      0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n      0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n      0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n      0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n      0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n      0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n      0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n      0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n      0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n      0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n      0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n      0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n      0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n      0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n      0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n      0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n      0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n      0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n      0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n      0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n      0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n      0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n      0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n      0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n      0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   ])\n  , triTable = [\n      [],\n      [0, 8, 3],\n      [0, 1, 9],\n      [1, 8, 3, 9, 8, 1],\n      [1, 2, 10],\n      [0, 8, 3, 1, 2, 10],\n      [9, 2, 10, 0, 2, 9],\n      [2, 8, 3, 2, 10, 8, 10, 9, 8],\n      [3, 11, 2],\n      [0, 11, 2, 8, 11, 0],\n      [1, 9, 0, 2, 3, 11],\n      [1, 11, 2, 1, 9, 11, 9, 8, 11],\n      [3, 10, 1, 11, 10, 3],\n      [0, 10, 1, 0, 8, 10, 8, 11, 10],\n      [3, 9, 0, 3, 11, 9, 11, 10, 9],\n      [9, 8, 10, 10, 8, 11],\n      [4, 7, 8],\n      [4, 3, 0, 7, 3, 4],\n      [0, 1, 9, 8, 4, 7],\n      [4, 1, 9, 4, 7, 1, 7, 3, 1],\n      [1, 2, 10, 8, 4, 7],\n      [3, 4, 7, 3, 0, 4, 1, 2, 10],\n      [9, 2, 10, 9, 0, 2, 8, 4, 7],\n      [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n      [8, 4, 7, 3, 11, 2],\n      [11, 4, 7, 11, 2, 4, 2, 0, 4],\n      [9, 0, 1, 8, 4, 7, 2, 3, 11],\n      [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1],\n      [3, 10, 1, 3, 11, 10, 7, 8, 4],\n      [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4],\n      [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3],\n      [4, 7, 11, 4, 11, 9, 9, 11, 10],\n      [9, 5, 4],\n      [9, 5, 4, 0, 8, 3],\n      [0, 5, 4, 1, 5, 0],\n      [8, 5, 4, 8, 3, 5, 3, 1, 5],\n      [1, 2, 10, 9, 5, 4],\n      [3, 0, 8, 1, 2, 10, 4, 9, 5],\n      [5, 2, 10, 5, 4, 2, 4, 0, 2],\n      [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n      [9, 5, 4, 2, 3, 11],\n      [0, 11, 2, 0, 8, 11, 4, 9, 5],\n      [0, 5, 4, 0, 1, 5, 2, 3, 11],\n      [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5],\n      [10, 3, 11, 10, 1, 3, 9, 5, 4],\n      [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10],\n      [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3],\n      [5, 4, 8, 5, 8, 10, 10, 8, 11],\n      [9, 7, 8, 5, 7, 9],\n      [9, 3, 0, 9, 5, 3, 5, 7, 3],\n      [0, 7, 8, 0, 1, 7, 1, 5, 7],\n      [1, 5, 3, 3, 5, 7],\n      [9, 7, 8, 9, 5, 7, 10, 1, 2],\n      [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3],\n      [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2],\n      [2, 10, 5, 2, 5, 3, 3, 5, 7],\n      [7, 9, 5, 7, 8, 9, 3, 11, 2],\n      [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11],\n      [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7],\n      [11, 2, 1, 11, 1, 7, 7, 1, 5],\n      [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11],\n      [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0],\n      [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0],\n      [11, 10, 5, 7, 11, 5],\n      [10, 6, 5],\n      [0, 8, 3, 5, 10, 6],\n      [9, 0, 1, 5, 10, 6],\n      [1, 8, 3, 1, 9, 8, 5, 10, 6],\n      [1, 6, 5, 2, 6, 1],\n      [1, 6, 5, 1, 2, 6, 3, 0, 8],\n      [9, 6, 5, 9, 0, 6, 0, 2, 6],\n      [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n      [2, 3, 11, 10, 6, 5],\n      [11, 0, 8, 11, 2, 0, 10, 6, 5],\n      [0, 1, 9, 2, 3, 11, 5, 10, 6],\n      [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11],\n      [6, 3, 11, 6, 5, 3, 5, 1, 3],\n      [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6],\n      [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9],\n      [6, 5, 9, 6, 9, 11, 11, 9, 8],\n      [5, 10, 6, 4, 7, 8],\n      [4, 3, 0, 4, 7, 3, 6, 5, 10],\n      [1, 9, 0, 5, 10, 6, 8, 4, 7],\n      [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4],\n      [6, 1, 2, 6, 5, 1, 4, 7, 8],\n      [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7],\n      [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6],\n      [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n      [3, 11, 2, 7, 8, 4, 10, 6, 5],\n      [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11],\n      [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6],\n      [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6],\n      [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6],\n      [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11],\n      [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7],\n      [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n      [10, 4, 9, 6, 4, 10],\n      [4, 10, 6, 4, 9, 10, 0, 8, 3],\n      [10, 0, 1, 10, 6, 0, 6, 4, 0],\n      [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10],\n      [1, 4, 9, 1, 2, 4, 2, 6, 4],\n      [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4],\n      [0, 2, 4, 4, 2, 6],\n      [8, 3, 2, 8, 2, 4, 4, 2, 6],\n      [10, 4, 9, 10, 6, 4, 11, 2, 3],\n      [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6],\n      [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10],\n      [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1],\n      [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3],\n      [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1],\n      [3, 11, 6, 3, 6, 0, 0, 6, 4],\n      [6, 4, 8, 11, 6, 8],\n      [7, 10, 6, 7, 8, 10, 8, 9, 10],\n      [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10],\n      [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0],\n      [10, 6, 7, 10, 7, 1, 1, 7, 3],\n      [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7],\n      [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9],\n      [7, 8, 0, 7, 0, 6, 6, 0, 2],\n      [7, 3, 2, 6, 7, 2],\n      [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7],\n      [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7],\n      [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11],\n      [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1],\n      [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6],\n      [0, 9, 1, 11, 6, 7],\n      [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0],\n      [7, 11, 6],\n      [7, 6, 11],\n      [3, 0, 8, 11, 7, 6],\n      [0, 1, 9, 11, 7, 6],\n      [8, 1, 9, 8, 3, 1, 11, 7, 6],\n      [10, 1, 2, 6, 11, 7],\n      [1, 2, 10, 3, 0, 8, 6, 11, 7],\n      [2, 9, 0, 2, 10, 9, 6, 11, 7],\n      [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n      [7, 2, 3, 6, 2, 7],\n      [7, 0, 8, 7, 6, 0, 6, 2, 0],\n      [2, 7, 6, 2, 3, 7, 0, 1, 9],\n      [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6],\n      [10, 7, 6, 10, 1, 7, 1, 3, 7],\n      [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8],\n      [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7],\n      [7, 6, 10, 7, 10, 8, 8, 10, 9],\n      [6, 8, 4, 11, 8, 6],\n      [3, 6, 11, 3, 0, 6, 0, 4, 6],\n      [8, 6, 11, 8, 4, 6, 9, 0, 1],\n      [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6],\n      [6, 8, 4, 6, 11, 8, 2, 10, 1],\n      [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6],\n      [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9],\n      [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n      [8, 2, 3, 8, 4, 2, 4, 6, 2],\n      [0, 4, 2, 4, 6, 2],\n      [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8],\n      [1, 9, 4, 1, 4, 2, 2, 4, 6],\n      [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1],\n      [10, 1, 0, 10, 0, 6, 6, 0, 4],\n      [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3],\n      [10, 9, 4, 6, 10, 4],\n      [4, 9, 5, 7, 6, 11],\n      [0, 8, 3, 4, 9, 5, 11, 7, 6],\n      [5, 0, 1, 5, 4, 0, 7, 6, 11],\n      [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5],\n      [9, 5, 4, 10, 1, 2, 7, 6, 11],\n      [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5],\n      [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2],\n      [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n      [7, 2, 3, 7, 6, 2, 5, 4, 9],\n      [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7],\n      [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0],\n      [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8],\n      [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7],\n      [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4],\n      [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10],\n      [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n      [6, 9, 5, 6, 11, 9, 11, 8, 9],\n      [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5],\n      [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11],\n      [6, 11, 3, 6, 3, 5, 5, 3, 1],\n      [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6],\n      [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10],\n      [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5],\n      [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n      [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2],\n      [9, 5, 6, 9, 6, 0, 0, 6, 2],\n      [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8],\n      [1, 5, 6, 2, 1, 6],\n      [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6],\n      [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0],\n      [0, 3, 8, 5, 6, 10],\n      [10, 5, 6],\n      [11, 5, 10, 7, 5, 11],\n      [11, 5, 10, 11, 7, 5, 8, 3, 0],\n      [5, 11, 7, 5, 10, 11, 1, 9, 0],\n      [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1],\n      [11, 1, 2, 11, 7, 1, 7, 5, 1],\n      [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11],\n      [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7],\n      [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n      [2, 5, 10, 2, 3, 5, 3, 7, 5],\n      [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5],\n      [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2],\n      [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2],\n      [1, 3, 5, 3, 7, 5],\n      [0, 8, 7, 0, 7, 1, 1, 7, 5],\n      [9, 0, 3, 9, 3, 5, 5, 3, 7],\n      [9, 8, 7, 5, 9, 7],\n      [5, 8, 4, 5, 10, 8, 10, 11, 8],\n      [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0],\n      [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5],\n      [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4],\n      [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8],\n      [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11],\n      [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5],\n      [9, 4, 5, 2, 11, 3],\n      [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4],\n      [5, 10, 2, 5, 2, 4, 4, 2, 0],\n      [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9],\n      [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2],\n      [8, 4, 5, 8, 5, 3, 3, 5, 1],\n      [0, 4, 5, 1, 0, 5],\n      [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5],\n      [9, 4, 5],\n      [4, 11, 7, 4, 9, 11, 9, 10, 11],\n      [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11],\n      [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11],\n      [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4],\n      [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2],\n      [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3],\n      [11, 7, 4, 11, 4, 2, 2, 4, 0],\n      [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n      [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9],\n      [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7],\n      [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10],\n      [1, 10, 2, 8, 7, 4],\n      [4, 9, 1, 4, 1, 7, 7, 1, 3],\n      [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1],\n      [4, 0, 3, 7, 4, 3],\n      [4, 8, 7],\n      [9, 10, 8, 10, 11, 8],\n      [3, 0, 9, 3, 9, 11, 11, 9, 10],\n      [0, 1, 10, 0, 10, 8, 8, 10, 11],\n      [3, 1, 10, 11, 3, 10],\n      [1, 2, 11, 1, 11, 9, 9, 11, 8],\n      [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9],\n      [0, 2, 11, 8, 0, 11],\n      [3, 2, 11],\n      [2, 3, 8, 2, 8, 10, 10, 8, 9],\n      [9, 10, 2, 0, 9, 2],\n      [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8],\n      [1, 10, 2],\n      [1, 3, 8, 9, 1, 8],\n      [0, 9, 1],\n      [0, 3, 8],\n      []]\n  , cubeVerts = [\n     [0,0,0]\n    ,[1,0,0]\n    ,[1,1,0]\n    ,[0,1,0]\n    ,[0,0,1]\n    ,[1,0,1]\n    ,[1,1,1]\n    ,[0,1,1]]\n  , edgeIndex = [ [0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7] ];\n\nreturn function(data, dims) {\n  var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = new Int32Array(3);\n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //For each cell, compute cube mask\n    var cube_index = 0;\n    for(var i=0; i<8; ++i) {\n      var v = cubeVerts[i]\n        , s = data[n + v[0] + dims[0] * (v[1] + dims[1] * v[2])];\n      grid[i] = s;\n      cube_index |= (s > 0) ? 1 << i : 0;\n    }\n    //Compute vertices\n    var edge_mask = edgeTable[cube_index];\n    if(edge_mask === 0) {\n      continue;\n    }\n    for(var i=0; i<12; ++i) {\n      if((edge_mask & (1<<i)) === 0) {\n        continue;\n      }\n      edges[i] = vertices.length;\n      var nv = [0,0,0]\n        , e = edgeIndex[i]\n        , p0 = cubeVerts[e[0]]\n        , p1 = cubeVerts[e[1]]\n        , a = grid[e[0]]\n        , b = grid[e[1]]\n        , d = a - b\n        , t = 0;\n      if(Math.abs(d) > 1e-6) {\n        t = a / d;\n      }\n      for(var j=0; j<3; ++j) {\n        nv[j] = (x[j] + p0[j]) + t * (p1[j] - p0[j]);\n      }\n      vertices.push(nv);\n    }\n    //Add faces\n    var f = triTable[cube_index];\n    for(var i=0; i<f.length; i += 3) {\n      faces.push([edges[f[i]], edges[f[i+1]], edges[f[i+2]]]);\n    }\n  }\n  return { vertices: vertices, faces: faces };\n};\n})();\n\nif(exports) {\n  exports.mesher = MarchingCubes;\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/marchingtetrahedra.js",
    "content": "/**\n * Marching Tetrahedra in Javascript\n *\n * Based on Paul Bourke's implementation\n *  http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * (Several bug fixes were made to deal with oriented faces)\n *\n * Javascript port by Mikola Lysenko\n */\nvar MarchingTetrahedra = (function() {\nvar cube_vertices = [\n        [0,0,0]\n      , [1,0,0]\n      , [1,1,0]\n      , [0,1,0]\n      , [0,0,1]\n      , [1,0,1]\n      , [1,1,1]\n      , [0,1,1] ]\n  , tetra_list = [\n        [0,2,3,7]\n      , [0,6,2,7]\n      , [0,4,6,7]\n      , [0,6,1,2]\n      , [0,1,6,4]\n      , [5,6,1,4] ];\n\nreturn function(data, dims) {\n   \n   var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = [0,0,0];\n    \n  function interp(i0, i1) {\n    var g0 = grid[i0]\n      , g1 = grid[i1]\n      , p0 = cube_vertices[i0]\n      , p1 = cube_vertices[i1]\n      , v  = [x[0], x[1], x[2]]\n      , t = g0 - g1;\n    if(Math.abs(t) > 1e-6) {\n      t = g0 / t;\n    }\n    for(var i=0; i<3; ++i) {\n      v[i] += p0[i] + t * (p1[i] - p0[i]);\n    }\n    vertices.push(v);\n    return vertices.length - 1;\n  }\n  \n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //Read in cube  \n    for(var i=0; i<8; ++i) {\n      grid[i] = data[n + cube_vertices[i][0] + dims[0] * (cube_vertices[i][1] + dims[1] * cube_vertices[i][2])];\n    }\n    for(var i=0; i<tetra_list.length; ++i) {\n      var T = tetra_list[i]\n        , triindex = 0;\n      if (grid[T[0]] < 0) triindex |= 1;\n      if (grid[T[1]] < 0) triindex |= 2;\n      if (grid[T[2]] < 0) triindex |= 4;\n      if (grid[T[3]] < 0) triindex |= 8;\n      \n      //Handle each case\n      switch (triindex) {\n        case 0x00:\n        case 0x0F:\n        break;\n        case 0x0E:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[3]) \n            , interp(T[0], T[2]) ]);\n        break;\n        case 0x01:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[2])\n            , interp(T[0], T[3])  ]);\n        break;\n        case 0x0D:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[2]) \n            , interp(T[1], T[3]) ]);\n        break;\n        case 0x02:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[3])\n            , interp(T[1], T[2]) ]);\n        break;\n        case 0x0C:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[1], T[3])\n              , interp(T[0], T[3])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x03:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[0], T[2])\n              , interp(T[0], T[3])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x04:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[1])\n              , interp(T[2], T[3]) ]);\n        break;\n        case 0x0B:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[3]) \n              , interp(T[2], T[1]) ]);\n        break;\n        case 0x05:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[1], T[2])\n              , interp(T[2], T[3])\n              , interp(T[0], T[3]) ]);\n        break;\n        case 0x0A:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[0], T[3])\n              , interp(T[2], T[3])\n              , interp(T[1], T[2]) ]);\n        break;\n        case 0x06:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[0], T[2])\n              , interp(T[0], T[1])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x09:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[1], T[3])\n              , interp(T[0], T[1])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x07:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[1])\n              , interp(T[3], T[2]) ]);\n        break;\n        case 0x08:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[2])\n              , interp(T[3], T[1]) ]);\n        break;\n      }\n    }\n  }\n  \n  return { vertices: vertices, faces: faces };\n}\n})();\n\n\nif(exports) {\n  exports.mesher = MarchingTetrahedra;\n}\n"
  },
  {
    "path": "LevelOfDetail/js/maxfilter.js",
    "content": "\n//Maximum filter\nfunction MaxFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/medianfilter.js",
    "content": "\n//Median filter\nfunction MedianFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0\n    , ranks = new Array(27);\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var idx = 0;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0) {\n        iz = -iz;\n      }\n      if(iz >= dims[2]) {\n        iz = 2*dims[2]-2-iz;\n      }\n      \n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0) {\n          iy = -iy;\n        }\n        if(iy >= dims[1]) {\n          iy = 2*dims[1]-2-iy;\n        }\n        \n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0) {\n            ix = -ix;\n          }\n          if(ix >= dims[0]) {\n            ix = 2*dims[0]-2-ix;\n          }\n          ranks[idx++] = volume[ix+dims[0]*(iy+dims[1]*(iz))];\n        }\n      }\n    }\n    var ranked = ranks.sort(function(a,b){ return b < a ? -1 : b>a ? 1 : 0; });\n    nvolume[n++] = 0.5 * (ranked[Math.floor(idx/2)] + ranked[Math.floor(idx/2)+1]);\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/minfilter.js",
    "content": "\n//Minimum filter\nfunction MinFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i] / 2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<2; ++dz) {\n      var iz = 2*(k)+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<2; ++dy) {\n        var iy = 2*(j)+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<2; ++dx) {\n          var ix = 2*(i)+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/nearestfilter.js",
    "content": "\n//Naive box filter for downsampling volume\nfunction NearestFilter(volume, dims) {\n  \"use strict\";\n  \n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.floor(dims[i]/2);\n  }\n  \n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2])\n    , n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    if(2*i < dims[0] && 2*j < dims[1] && 2*k < dims[2]) {\n      nvolume[n++] = volume[2*i + dims[0] * (2*j + dims[1] * (2* k))];\n    } else {\n      nvolume[n++] = 1.0;\n    }\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/opening.js",
    "content": "\n//Morophological opening filter\nfunction OpeningFilter(volume, dims) {\n  \"use strict\";\n  \n\n  //Erode\n  var pvolume = new Float32Array(dims[0] * dims[1] * dims[2])\n    , n = 0;\n  for(var k=0; k<dims[2]; ++k)\n  for(var j=0; j<dims[1]; ++j)\n  for(var i=0; i<dims[0]; ++i) {\n    var s = -1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.max(s, volume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    pvolume[n++] = s;\n  }\n  \n  //Dilate\n  var ndims = new Int32Array(3);\n  for(var i=0; i<3; ++i) {\n    ndims[i] = Math.ceil(dims[i]/2);\n  }\n  var nvolume = new Float32Array(ndims[0] * ndims[1] * ndims[2]);\n  n = 0;\n  for(var k=0; k<ndims[2]; ++k)\n  for(var j=0; j<ndims[1]; ++j)\n  for(var i=0; i<ndims[0]; ++i) {\n    var s = 1e16;\n    for(var dz=-1; dz<=1; ++dz) {\n      var iz = 2*k+dz;\n      if(iz < 0 || iz >=dims[2]) {\n        continue;\n      }\n      for(var dy=-1; dy<=1; ++dy) {\n        var iy = 2*j+dy;\n        if(iy < 0 || iy >= dims[1]) {\n          continue;\n        }\n        for(var dx=-1; dx<=1; ++dx) {\n          var ix = 2*i+dx;\n          if(ix < 0 || ix >= dims[0]) {\n            continue;\n          }\n          s = Math.min(s, pvolume[ix+dims[0]*(iy+dims[1]*(iz))]);\n        }\n      }\n    }\n    nvolume[n++] = s;\n  }\n  \n  return { volume: nvolume, dims:ndims };\n}\n\n"
  },
  {
    "path": "LevelOfDetail/js/perlinnoise.js",
    "content": "\n//This code is from Kas Thomas' blog:\n//  http://asserttrue.blogspot.de/2011/12/perlin-noise-in-javascript_31.html\n\n// This is a port of Ken Perlin's Java code. The\n// original Java code is at http://cs.nyu.edu/%7Eperlin/noise/.\n// Note that in this version, a number from 0 to 1 is returned.\nPerlinNoise = new function() {\n\nthis.noise = function(x, y, z) {\n\n   var p = new Array(512)\n   var permutation = [ 151,160,137,91,90,15,\n   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n   ];\n   for (var i=0; i < 256 ; i++) \n p[256+i] = p[i] = permutation[i]; \n\n      var X = Math.floor(x) & 255,                  // FIND UNIT CUBE THAT\n          Y = Math.floor(y) & 255,                  // CONTAINS POINT.\n          Z = Math.floor(z) & 255;\n      x -= Math.floor(x);                                // FIND RELATIVE X,Y,Z\n      y -= Math.floor(y);                                // OF POINT IN CUBE.\n      z -= Math.floor(z);\n      var    u = fade(x),                                // COMPUTE FADE CURVES\n             v = fade(y),                                // FOR EACH OF X,Y,Z.\n             w = fade(z);\n      var A = p[X  ]+Y, AA = p[A]+Z, AB = p[A+1]+Z,      // HASH COORDINATES OF\n          B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;      // THE 8 CUBE CORNERS,\n\n      return scale(lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ),  // AND ADD\n                                     grad(p[BA  ], x-1, y  , z   )), // BLENDED\n                             lerp(u, grad(p[AB  ], x  , y-1, z   ),  // RESULTS\n                                     grad(p[BB  ], x-1, y-1, z   ))),// FROM  8\n                     lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  // CORNERS\n                                     grad(p[BA+1], x-1, y  , z-1 )), // OF CUBE\n                             lerp(u, grad(p[AB+1], x  , y-1, z-1 ),\n                                     grad(p[BB+1], x-1, y-1, z-1 )))));\n   }\n   function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n   function lerp( t, a, b) { return a + t * (b - a); }\n   function grad(hash, x, y, z) {\n      var h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE\n      var u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.\n             v = h<4 ? y : h==12||h==14 ? x : z;\n      return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);\n   } \n   function scale(n) { return (1 + n)/2; }\n}\n"
  },
  {
    "path": "LevelOfDetail/js/surfacenets.js",
    "content": "/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\nvar SurfaceNets = (function() {\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Int32Array(4096);\n\nreturn function(data, dims) {\n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = new Int32Array(3)\n    , R = new Int32Array([1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)])\n    , grid = new Float32Array(8)\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    buffer = new Int32Array(R[2] * 2);\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { vertices: vertices, faces: faces };\n};\n})();\n"
  },
  {
    "path": "LevelOfDetail/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function triangle_wave(t) {\n    var it = Math.floor(t);\n    if(!!(it & 1)) {\n      return t - it;\n    }\n    return 1 - (t-it);\n  }\n  \n  function memoize(f) {\n    var cached = null;\n    return function() {\n      if(cached === null) { \n        cached = f();\n      }\n      return cached;\n    }\n  }\n  \n  function makeVolume(dims, f) {\n    return memoize(function() {\n      var res = new Array(3);\n      for(var i=0; i<3; ++i) {\n        res[i] = 2 + Math.ceil((dims[i][1] - dims[i][0]) / dims[i][2]);\n      }\n      var volume = new Float32Array(res[0] * res[1] * res[2])\n        , n = 0;\n      for(var k=0, z=dims[2][0]-dims[2][2]; k<res[2]; ++k, z+=dims[2][2])\n      for(var j=0, y=dims[1][0]-dims[1][2]; j<res[1]; ++j, y+=dims[1][2])\n      for(var i=0, x=dims[0][0]-dims[0][2]; i<res[0]; ++i, x+=dims[0][2], ++n) {\n        volume[n] = f(x,y,z);\n      }\n      return {volume: volume, dims:res};\n    });\n  } \n\n  result['Sphere'] = makeVolume(\n    [[-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05]],\n    function(x,y,z) {\n      var r = Math.sqrt(x*x + y*y + z*z);\n      return r - 0.64;\n    }\n  )\n\n  result['Torus'] = makeVolume(\n    [[-2.2, 2.2, 4.4 / 62.0],\n     [-2.2, 2.2, 4.4 / 62.0],\n     [-1.4, 1.4, 4.4 / 62.0]],\n    function(x,y,z) {\n      return Math.pow(1.0 - Math.sqrt(x*x + y*y), 2) + z*z - 0.25;\n    }\n  );\n  \n  result['Hyperboloid'] = makeVolume(\n    [[-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0]],\n    function(x,y,z) {\n      return Math.max(-1.4-z, Math.max(z-1.4,x*x + y*y - z*z - 0.1));\n    }\n  );\n  \n  result['Paraboloid'] = makeVolume(\n    [[-2.1, 2.1, 4.2/94.0],\n     [-2.1, 2.1, 4.2/94.0],\n     [-0.5, 2.5, 3.0/62.0]],\n    function(x,y,z) {\n      return Math.max(z-1.75, x*x + y*y - z);\n    }\n  )\n  \n  result['Saddle'] = makeVolume(\n    [[-2.0, 2.0, 4.0/94.0],\n     [-2.0, 2.0, 4.0/94.0],\n     [-2.0, 2.0, 4.0/94.0]],\n    function(x,y,z) {\n      return x*x - y*y - z;\n    }\n  )\n  \n\n  \n  \n  result['Hyperelliptic'] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      return Math.pow( Math.pow(x, 6) + Math.pow(y, 6) + Math.pow(z, 6), 1.0/6.0 ) - 1.0;\n    }  \n  );\n  \n  result['Thin Plates'] = makeVolume(\n    [[1, 63, 1],\n     [1, 63, 1],\n     [1, 63, 1]],\n    function(x,y,z) {\n      var t = 7.0 * triangle_wave(x / 7.0) - 0.5;\n      if( x < 10 ) {\n        t = Math.max(t, 10-x);\n      }\n      if( y < 10 ) {\n        t = Math.max(t, 10-y);\n      }\n      if( z < 10 )  {\n        t = Math.max(t, 10-z);\n      }\n      if( x > 54 ) {\n        t = Math.max(t, x - 54);\n      }\n      if( y > 54 ) {\n        t = Math.max(t, y - 54);\n      }\n      if( z > 54 ) {\n        t = Math.max(t, z - 54);\n      }\n      return t;\n    }\n  );\n  \n  \n  result[\"Goursat's Surface\"] = makeVolume(\n    [[-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0]],\n    function(x,y,z) {\n      return Math.pow(x,4) + Math.pow(y,4) + Math.pow(z,4) - 1.5 * (x*x  + y*y + z*z) + 1;\n    }\n  );\n  \n  result[\"Heart\"] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      y *= 1.5;\n      z *= 1.5;\n      return Math.pow(2*x*x+y*y+2*z*z-1, 3) - 0.1 * z*z*y*y*y - y*y*y*x*x;\n    }\n  );\n  \n  result['Noise (Slow)'] = makeVolume(\n    [[-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0]], \n    function(x,y,z) {\n      if(x < -1.0 || x > 1.0 ||\n         y < -1.0 || y > 1.0 ||\n         z < -1.0 || z > 1.0 ) {\n        return 0.6;   \n      }\n      return 0.6 - PerlinNoise.noise(4.0 * x, 4.0 * y, 4.0 * z);\n    }\n  );\n    \n  result['Asteroid (Slow)'] = makeVolume(\n    [[-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0]],\n    function(x,y,z) {\n      return (x*x + y*y + z*z) - PerlinNoise.noise(x*2,y*2,z*2);\n    }\n  );\n  \n  result['Terrain (Slow)'] = makeVolume(\n    [[-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0]],\n    function(x,y,z) {\n      return  y + PerlinNoise.noise(x*2+5,y*2+3,z*2+0.6);\n    }\n  );\n  \n  \n  result['Empty'] = function(){ return { volume: new Float32Array(32*32*32), dims:[32,32,32] } };\n  \n  return result;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/dsp.js",
    "content": "/* \n *  DSP.js - a comprehensive digital signal processing  library for javascript\n * \n *  Created by Corban Brook <corbanbrook@gmail.com> on 2010-01-01.\n *  Copyright 2010 Corban Brook. All rights reserved.\n *\n */\n\n////////////////////////////////////////////////////////////////////////////////\n//                                  CONSTANTS                                 //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DSP is an object which contains general purpose utility functions and constants\n */\nvar DSP = {\n  // Channels\n  LEFT:           0,\n  RIGHT:          1,\n  MIX:            2,\n\n  // Waveforms\n  SINE:           1,\n  TRIANGLE:       2,\n  SAW:            3,\n  SQUARE:         4,\n\n  // Filters\n  LOWPASS:        0,\n  HIGHPASS:       1,\n  BANDPASS:       2,\n  NOTCH:          3,\n\n  // Window functions\n  BARTLETT:       1,\n  BARTLETTHANN:   2,\n  BLACKMAN:       3,\n  COSINE:         4,\n  GAUSS:          5,\n  HAMMING:        6,\n  HANN:           7,\n  LANCZOS:        8,\n  RECTANGULAR:    9,\n  TRIANGULAR:     10,\n\n  // Loop modes\n  OFF:            0,\n  FW:             1,\n  BW:             2,\n  FWBW:           3,\n\n  // Math\n  TWO_PI:         2*Math.PI\n};\n\n// Setup arrays for platforms which do not support byte arrays\nfunction setupTypedArray(name, fallback) {\n  // check if TypedArray exists\n  // typeof on Minefield and Chrome return function, typeof on Webkit returns object.\n  if (typeof this[name] !== \"function\" && typeof this[name] !== \"object\") {\n    // nope.. check if WebGLArray exists\n    if (typeof this[fallback] === \"function\" && typeof this[fallback] !== \"object\") {\n      this[name] = this[fallback];\n    } else {\n      // nope.. set as Native JS array\n      this[name] = function(obj) {\n        if (obj instanceof Array) {\n          return obj;\n        } else if (typeof obj === \"number\") {\n          return new Array(obj);\n        }\n      };\n    }\n  }\n}\n\nsetupTypedArray(\"Float32Array\", \"WebGLFloatArray\");\nsetupTypedArray(\"Int32Array\",   \"WebGLIntArray\");\nsetupTypedArray(\"Uint16Array\",  \"WebGLUnsignedShortArray\");\nsetupTypedArray(\"Uint8Array\",   \"WebGLUnsignedByteArray\");\n\n\n////////////////////////////////////////////////////////////////////////////////\n//                            DSP UTILITY FUNCTIONS                           //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Inverts the phase of a signal\n *\n * @param {Array} buffer A sample buffer\n *\n * @returns The inverted sample buffer\n */\nDSP.invert = function(buffer) {\n  for (var i = 0, len = buffer.length; i < len; i++) {\n    buffer[i] *= -1;\n  }\n\n  return buffer;\n};\n\n/**\n * Converts split-stereo (dual mono) sample buffers into a stereo interleaved sample buffer\n *\n * @param {Array} left  A sample buffer\n * @param {Array} right A sample buffer\n *\n * @returns The stereo interleaved buffer\n */\nDSP.interleave = function(left, right) {\n  if (left.length !== right.length) {\n    throw \"Can not interleave. Channel lengths differ.\";\n  }\n \n  var stereoInterleaved = new Float32Array(left.length * 2);\n \n  for (var i = 0, len = left.length; i < len; i++) {\n    stereoInterleaved[2*i]   = left[i];\n    stereoInterleaved[2*i+1] = right[i];\n  }\n \n  return stereoInterleaved;\n};\n\n/**\n * Converts a stereo-interleaved sample buffer into split-stereo (dual mono) sample buffers\n *\n * @param {Array} buffer A stereo-interleaved sample buffer\n *\n * @returns an Array containing left and right channels\n */\nDSP.deinterleave = (function() {\n  var left, right, mix, deinterleaveChannel = []; \n\n  deinterleaveChannel[DSP.MIX] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      mix[i] = (buffer[2*i] + buffer[2*i+1]) / 2;\n    }\n    return mix;\n  };\n\n  deinterleaveChannel[DSP.LEFT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      left[i]  = buffer[2*i];\n    }\n    return left;\n  };\n\n  deinterleaveChannel[DSP.RIGHT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      right[i]  = buffer[2*i+1];\n    }\n    return right;\n  };\n\n  return function(channel, buffer) { \n    left  = left  || new Float32Array(buffer.length/2);\n    right = right || new Float32Array(buffer.length/2);\n    mix   = mix   || new Float32Array(buffer.length/2);\n\n    if (buffer.length/2 !== left.length) {\n      left  = new Float32Array(buffer.length/2);\n      right = new Float32Array(buffer.length/2);\n      mix   = new Float32Array(buffer.length/2);\n    }\n\n    return deinterleaveChannel[channel](buffer);\n  };\n}());\n\n/**\n * Separates a channel from a stereo-interleaved sample buffer\n *\n * @param {Array}  buffer A stereo-interleaved sample buffer\n * @param {Number} channel A channel constant (LEFT, RIGHT, MIX)\n *\n * @returns an Array containing a signal mono sample buffer\n */\nDSP.getChannel = DSP.deinterleave;\n\n/**\n * Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible\n * to negate the second buffer while mixing and to perform a volume correction\n * on the final signal.\n *\n * @param {Array} sampleBuffer1 Array containing Float values or a Float32Array\n * @param {Array} sampleBuffer2 Array containing Float values or a Float32Array\n * @param {Boolean} negate When true inverts/flips the audio signal\n * @param {Number} volumeCorrection When you add multiple sample buffers, use this to tame your signal ;)\n *\n * @returns A new Float32Array interleaved buffer.\n */\nDSP.mixSampleBuffers = function(sampleBuffer1, sampleBuffer2, negate, volumeCorrection){\n  var outputSamples = new Float32Array(sampleBuffer1);\n\n  for(var i = 0; i<sampleBuffer1.length; i++){\n    outputSamples[i] += (negate ? -sampleBuffer2[i] : sampleBuffer2[i]) / volumeCorrection;\n  }\n \n  return outputSamples;\n}; \n\n// Biquad filter types\nDSP.LPF = 0;                // H(s) = 1 / (s^2 + s/Q + 1)\nDSP.HPF = 1;                // H(s) = s^2 / (s^2 + s/Q + 1)\nDSP.BPF_CONSTANT_SKIRT = 2; // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\nDSP.BPF_CONSTANT_PEAK = 3;  // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\nDSP.NOTCH = 4;              // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\nDSP.APF = 5;                // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\nDSP.PEAKING_EQ = 6;         // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\nDSP.LOW_SHELF = 7;          // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\nDSP.HIGH_SHELF = 8;         // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n\n// Biquad filter parameter types\nDSP.Q = 1;\nDSP.BW = 2; // SHARED with BACKWARDS LOOP MODE\nDSP.S = 3;\n\n// Find RMS of signal\nDSP.RMS = function(buffer) {\n  var total = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    total += buffer[i] * buffer[i];\n  }\n  \n  return Math.sqrt(total / n);\n};\n\n// Find Peak of signal\nDSP.Peak = function(buffer) {\n  var peak = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    peak = (Math.abs(buffer[i]) > peak) ? Math.abs(buffer[i]) : peak; \n  }\n  \n  return peak;\n};\n\n// Fourier Transform Module used by DFT, FFT, RFFT\nfunction FourierTransform(bufferSize, sampleRate) {\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.bandwidth  = 2 / bufferSize * sampleRate / 2;\n\n  this.spectrum   = new Float32Array(bufferSize/2);\n  this.real       = new Float32Array(bufferSize);\n  this.imag       = new Float32Array(bufferSize);\n\n  this.peakBand   = 0;\n  this.peak       = 0;\n\n  /**\n   * Calculates the *middle* frequency of an FFT band.\n   *\n   * @param {Number} index The index of the FFT band.\n   *\n   * @returns The middle frequency in Hz.\n   */\n  this.getBandFrequency = function(index) {\n    return this.bandwidth * index + this.bandwidth / 2;\n  };\n\n  this.calculateSpectrum = function() {\n    var spectrum  = this.spectrum,\n        real      = this.real,\n        imag      = this.imag,\n        bSi       = 2 / this.bufferSize,\n        sqrt      = Math.sqrt,\n        rval, \n        ival,\n        mag;\n\n    for (var i = 0, N = bufferSize/2; i < N; i++) {\n      rval = real[i];\n      ival = imag[i];\n      mag = bSi * sqrt(rval * rval + ival * ival);\n\n      if (mag > this.peak) {\n        this.peakBand = i;\n        this.peak = mag;\n      }\n\n      spectrum[i] = mag;\n    }\n  };\n}\n\n/**\n * DFT is a class for calculating the Discrete Fourier Transform of a signal.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction DFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  var N = bufferSize/2 * bufferSize;\n  var TWO_PI = 2 * Math.PI;\n\n  this.sinTable = new Float32Array(N);\n  this.cosTable = new Float32Array(N);\n\n  for (var i = 0; i < N; i++) {\n    this.sinTable[i] = Math.sin(i * TWO_PI / bufferSize);\n    this.cosTable[i] = Math.cos(i * TWO_PI / bufferSize);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer\n *\n * @returns The frequency spectrum array\n */\nDFT.prototype.forward = function(buffer) {\n  var real = this.real, \n      imag = this.imag,\n      rval,\n      ival;\n\n  for (var k = 0; k < this.bufferSize/2; k++) {\n    rval = 0.0;\n    ival = 0.0;\n\n    for (var n = 0; n < buffer.length; n++) {\n      rval += this.cosTable[k*n] * buffer[n];\n      ival += this.sinTable[k*n] * buffer[n];\n    }\n\n    real[k] = rval;\n    imag[k] = ival;\n  }\n\n  return this.calculateSpectrum();\n};\n\n\n/**\n * FFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction FFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n   \n  this.reverseTable = new Uint32Array(bufferSize);\n\n  var limit = 1;\n  var bit = bufferSize >> 1;\n\n  var i;\n\n  while (limit < bufferSize) {\n    for (i = 0; i < limit; i++) {\n      this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n    }\n\n    limit = limit << 1;\n    bit = bit >> 1;\n  }\n\n  this.sinTable = new Float32Array(bufferSize);\n  this.cosTable = new Float32Array(bufferSize);\n\n  for (i = 0; i < bufferSize; i++) {\n    this.sinTable[i] = Math.sin(-Math.PI/i);\n    this.cosTable[i] = Math.cos(-Math.PI/i);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer. Buffer Length must be power of 2\n *\n * @returns The frequency spectrum array\n */\nFFT.prototype.forward = function(buffer) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      real            = this.real,\n      imag            = this.imag,\n      spectrum        = this.spectrum;\n\n  var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n  if (Math.pow(2, k) !== bufferSize) { throw \"Invalid buffer size, must be a power of 2.\"; }\n  if (bufferSize !== buffer.length)  { throw \"Supplied buffer is not the same size as defined FFT. FFT Size: \" + bufferSize + \" Buffer Size: \" + buffer.length; }\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    real[i] = buffer[reverseTable[i]];\n    imag[i] = 0;\n  }\n\n  while (halfSize < bufferSize) {\n    //phaseShiftStepReal = Math.cos(-Math.PI/halfSize);\n    //phaseShiftStepImag = Math.sin(-Math.PI/halfSize);\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    \n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  return this.calculateSpectrum();\n};\n\nFFT.prototype.inverse = function(real, imag) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      spectrum        = this.spectrum;\n     \n      real = real || this.real;\n      imag = imag || this.imag;\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    imag[i] *= -1;\n  }\n\n  var revReal = new Float32Array(bufferSize);\n  var revImag = new Float32Array(bufferSize);\n \n  for (i = 0; i < real.length; i++) {\n    revReal[i] = real[reverseTable[i]];\n    revImag[i] = imag[reverseTable[i]];\n  }\n \n  real = revReal;\n  imag = revImag;\n\n  while (halfSize < bufferSize) {\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  var buffer = new Float32Array(bufferSize); // this should be reused instead\n  for (i = 0; i < bufferSize; i++) {\n    buffer[i] = real[i] / bufferSize;\n  }\n\n  return buffer;\n};\n\n/**\n * RFFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * This method currently only contains a forward transform but is highly optimized.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\n\n// lookup tables don't really gain us any speed, but they do increase\n// cache footprint, so don't use them in here\n\n// also we don't use sepearate arrays for real/imaginary parts\n\n// this one a little more than twice as fast as the one in FFT\n// however I only did the forward transform\n\n// the rest of this was translated from C, see http://www.jjj.de/fxt/\n// this is the real split radix FFT\n\nfunction RFFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  this.trans = new Float32Array(bufferSize);\n\n  this.reverseTable = new Uint32Array(bufferSize);\n\n  // don't use a lookup table to do the permute, use this instead\n  this.reverseBinPermute = function (dest, source) {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    dest[0] = source[0];\n\n    do {\n      r += halfSize;\n      dest[i] = source[r];\n      dest[r] = source[i];\n      \n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        dest[i]     = source[r]; \n        dest[r]     = source[i];\n\n        dest[nm1-i] = source[nm1-r]; \n        dest[nm1-r] = source[nm1-i];\n      }\n      i++;\n    } while (i < halfSize);\n    dest[nm1] = source[nm1];\n  };\n\n  this.generateReverseTable = function () {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    this.reverseTable[0] = 0;\n\n    do {\n      r += halfSize;\n      \n      this.reverseTable[i] = r;\n      this.reverseTable[r] = i;\n\n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        this.reverseTable[i] = r;\n        this.reverseTable[r] = i;\n\n        this.reverseTable[nm1-i] = nm1-r;\n        this.reverseTable[nm1-r] = nm1-i;\n      }\n      i++;\n    } while (i < halfSize);\n\n    this.reverseTable[nm1] = nm1;\n  };\n\n  this.generateReverseTable();\n}\n\n\n// Ordering of output:\n//\n// trans[0]     = re[0] (==zero frequency, purely real)\n// trans[1]     = re[1]\n//             ...\n// trans[n/2-1] = re[n/2-1]\n// trans[n/2]   = re[n/2]    (==nyquist frequency, purely real)\n//\n// trans[n/2+1] = im[n/2-1]\n// trans[n/2+2] = im[n/2-2]\n//             ...\n// trans[n-1]   = im[1] \n\nRFFT.prototype.forward = function(buffer) {\n  var n         = this.bufferSize, \n      spectrum  = this.spectrum,\n      x         = this.trans, \n      TWO_PI    = 2*Math.PI,\n      sqrt      = Math.sqrt,\n      i         = n >>> 1,\n      bSi       = 2 / n,\n      n2, n4, n8, nn, \n      t1, t2, t3, t4, \n      i1, i2, i3, i4, i5, i6, i7, i8, \n      st1, cc1, ss1, cc3, ss3,\n      e, \n      a,\n      rval, ival, mag; \n\n  this.reverseBinPermute(x, buffer);\n\n  /*\n  var reverseTable = this.reverseTable;\n\n  for (var k = 0, len = reverseTable.length; k < len; k++) {\n    x[k] = buffer[reverseTable[k]];\n  }\n  */\n\n  for (var ix = 0, id = 4; ix < n; id *= 4) {\n    for (var i0 = ix; i0 < n; i0 += id) {\n      //sumdiff(x[i0], x[i0+1]); // {a, b}  <--| {a+b, a-b}\n      st1 = x[i0] - x[i0+1];\n      x[i0] += x[i0+1];\n      x[i0+1] = st1;\n    } \n    ix = 2*(id-1);\n  }\n\n  n2 = 2;\n  nn = n >>> 1;\n\n  while((nn = nn >>> 1)) {\n    ix = 0;\n    n2 = n2 << 1;\n    id = n2 << 1;\n    n4 = n2 >>> 2;\n    n8 = n2 >>> 3;\n    do {\n      if(n4 !== 1) {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4];\n          x[i4] -= x[i3];\n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n     \n          i1 += n8;\n          i2 += n8;\n          i3 += n8;\n          i4 += n8;\n         \n          //sumdiff(x[i3], x[i4], t1, t2); // {s, d}  <--| {a+b, a-b}\n          t1 = x[i3] + x[i4];\n          t2 = x[i3] - x[i4];\n         \n          t1 = -t1 * Math.SQRT1_2;\n          t2 *= Math.SQRT1_2;\n     \n          // sumdiff(t1, x[i2], x[i4], x[i3]); // {s, d}  <--| {a+b, a-b}\n          st1 = x[i2];\n          x[i4] = t1 + st1; \n          x[i3] = t1 - st1;\n          \n          //sumdiff3(x[i1], t2, x[i2]); // {a, b, d} <--| {a+b, b, a-b}\n          x[i2] = x[i1] - t2;\n          x[i1] += t2;\n        }\n      } else {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4]; \n          x[i4] -= x[i3];\n          \n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n        }\n      }\n   \n      ix = (id << 1) - n2;\n      id = id << 2;\n    } while (ix < n);\n \n    e = TWO_PI / n2;\n\n    for (var j = 1; j < n8; j++) {\n      a = j * e;\n      ss1 = Math.sin(a);\n      cc1 = Math.cos(a);\n\n      //ss3 = sin(3*a); cc3 = cos(3*a);\n      cc3 = 4*cc1*(cc1*cc1-0.75);\n      ss3 = 4*ss1*(0.75-ss1*ss1);\n   \n      ix = 0; id = n2 << 1;\n      do {\n        for (i0 = ix; i0 < n; i0 += id) {\n          i1 = i0 + j;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n       \n          i5 = i0 + n4 - j;\n          i6 = i5 + n4;\n          i7 = i6 + n4;\n          i8 = i7 + n4;\n       \n          //cmult(c, s, x, y, &u, &v)\n          //cmult(cc1, ss1, x[i7], x[i3], t2, t1); // {u,v} <--| {x*c-y*s, x*s+y*c}\n          t2 = x[i7]*cc1 - x[i3]*ss1; \n          t1 = x[i7]*ss1 + x[i3]*cc1;\n          \n          //cmult(cc3, ss3, x[i8], x[i4], t4, t3);\n          t4 = x[i8]*cc3 - x[i4]*ss3; \n          t3 = x[i8]*ss3 + x[i4]*cc3;\n       \n          //sumdiff(t2, t4);   // {a, b} <--| {a+b, a-b}\n          st1 = t2 - t4;\n          t2 += t4;\n          t4 = st1;\n          \n          //sumdiff(t2, x[i6], x[i8], x[i3]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i6]; x[i8] = t2 + st1; x[i3] = t2 - st1;\n          x[i8] = t2 + x[i6]; \n          x[i3] = t2 - x[i6];\n         \n          //sumdiff_r(t1, t3); // {a, b} <--| {a+b, b-a}\n          st1 = t3 - t1;\n          t1 += t3;\n          t3 = st1;\n          \n          //sumdiff(t3, x[i2], x[i4], x[i7]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i2]; x[i4] = t3 + st1; x[i7] = t3 - st1;\n          x[i4] = t3 + x[i2]; \n          x[i7] = t3 - x[i2];\n         \n          //sumdiff3(x[i1], t1, x[i6]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i6] = x[i1] - t1; \n          x[i1] += t1;\n          \n          //diffsum3_r(t4, x[i5], x[i2]); // {a, b, s} <--| {a, b-a, a+b}\n          x[i2] = t4 + x[i5]; \n          x[i5] -= t4;\n        }\n     \n        ix = (id << 1) - n2;\n        id = id << 2;\n   \n      } while (ix < n);\n    }\n  }\n\n  while (--i) {\n    rval = x[i];\n    ival = x[n-i-1];\n    mag = bSi * sqrt(rval * rval + ival * ival);\n\n    if (mag > this.peak) {\n      this.peakBand = i;\n      this.peak = mag;\n    }\n\n    spectrum[i] = mag;\n  }\n\n  spectrum[0] = bSi * x[0];\n\n  return spectrum;\n};\n\nfunction Sampler(file, bufferSize, sampleRate, playStart, playEnd, loopStart, loopEnd, loopMode) {\n  this.file = file;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.playStart  = playStart || 0; // 0%\n  this.playEnd    = playEnd   || 1; // 100%\n  this.loopStart  = loopStart || 0;\n  this.loopEnd    = loopEnd   || 1;\n  this.loopMode   = loopMode  || DSP.OFF;\n  this.loaded     = false;\n  this.samples    = [];\n  this.signal     = new Float32Array(bufferSize);\n  this.frameCount = 0;\n  this.envelope   = null;\n  this.amplitude  = 1;\n  this.rootFrequency = 110; // A2 110\n  this.frequency  = 550;\n  this.step       = this.frequency / this.rootFrequency;\n  this.duration   = 0;\n  this.samplesProcessed = 0;\n  this.playhead   = 0;\n \n  var audio = /* new Audio();*/ document.createElement(\"AUDIO\");\n  var self = this;\n \n  this.loadSamples = function(event) {\n    var buffer = DSP.getChannel(DSP.MIX, event.frameBuffer);\n    for ( var i = 0; i < buffer.length; i++) {\n      self.samples.push(buffer[i]);\n    }\n  };\n \n  this.loadComplete = function() {\n    // convert flexible js array into a fast typed array\n    self.samples = new Float32Array(self.samples);\n    self.loaded = true;\n  };\n \n  this.loadMetaData = function() {\n    self.duration = audio.duration;\n  };\n \n  audio.addEventListener(\"MozAudioAvailable\", this.loadSamples, false);\n  audio.addEventListener(\"loadedmetadata\", this.loadMetaData, false);\n  audio.addEventListener(\"ended\", this.loadComplete, false);\n  audio.muted = true;\n  audio.src = file;\n  audio.play();\n}\n\nSampler.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n  return this.signal;\n};\n\nSampler.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n \n  var loopWidth = this.playEnd * this.samples.length - this.playStart * this.samples.length;\n  var playStartSamples = this.playStart * this.samples.length; // ie 0.5 -> 50% of the length\n  var playEndSamples = this.playEnd * this.samples.length; // ie 0.5 -> 50% of the length\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    switch (this.loopMode) {\n      case DSP.OFF:\n        this.playhead = Math.round(this.samplesProcessed * this.step + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        } else {\n          this.signal[i] = 0;\n        }\n        break;\n     \n      case DSP.FW:\n        this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.BW:\n        this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.FWBW:\n        if ( Math.floor(this.samplesProcessed * this.step / loopWidth) % 2 === 0 ) {\n          this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        } else {\n          this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        }  \n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n    }\n    this.samplesProcessed++;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nSampler.prototype.setFreq = function(frequency) {\n    var totalProcessed = this.samplesProcessed * this.step;\n    this.frequency = frequency;\n    this.step = this.frequency / this.rootFrequency;\n    this.samplesProcessed = Math.round(totalProcessed/this.step);\n};\n\nSampler.prototype.reset = function() {\n  this.samplesProcessed = 0;\n  this.playhead = 0;\n};\n\n/**\n * Oscillator class for generating and modifying signals\n *\n * @param {Number} type       A waveform constant (eg. DSP.SINE)\n * @param {Number} frequency  Initial frequency of the signal\n * @param {Number} amplitude  Initial amplitude of the signal\n * @param {Number} bufferSize Size of the sample buffer to generate\n * @param {Number} sampleRate The sample rate of the signal\n *\n * @contructor\n */\nfunction Oscillator(type, frequency, amplitude, bufferSize, sampleRate) {\n  this.frequency  = frequency;\n  this.amplitude  = amplitude;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  //this.pulseWidth = pulseWidth;\n  this.frameCount = 0;\n \n  this.waveTableLength = 2048;\n\n  this.cyclesPerSample = frequency / sampleRate;\n\n  this.signal = new Float32Array(bufferSize);\n  this.envelope = null;\n\n  switch(parseInt(type, 10)) {\n    case DSP.TRIANGLE:\n      this.func = Oscillator.Triangle;\n      break;\n\n    case DSP.SAW:\n      this.func = Oscillator.Saw;\n      break;\n\n    case DSP.SQUARE:\n      this.func = Oscillator.Square;\n      break;\n\n    default:\n    case DSP.SINE:\n      this.func = Oscillator.Sine;\n      break;\n  }\n\n  this.generateWaveTable = function() {\n    Oscillator.waveTable[this.func] = new Float32Array(2048);\n    var waveTableTime = this.waveTableLength / this.sampleRate;\n    var waveTableHz = 1 / waveTableTime;\n\n    for (var i = 0; i < this.waveTableLength; i++) {\n      Oscillator.waveTable[this.func][i] = this.func(i * waveTableHz/this.sampleRate);\n    }\n  };\n\n  if ( typeof Oscillator.waveTable === 'undefined' ) {\n    Oscillator.waveTable = {};\n  }\n\n  if ( typeof Oscillator.waveTable[this.func] === 'undefined' ) {\n    this.generateWaveTable();\n  }\n \n  this.waveTable = Oscillator.waveTable[this.func];\n}\n\n/**\n * Set the amplitude of the signal\n *\n * @param {Number} amplitude The amplitude of the signal (between 0 and 1)\n */\nOscillator.prototype.setAmp = function(amplitude) {\n  if (amplitude >= 0 && amplitude <= 1) {\n    this.amplitude = amplitude;\n  } else {\n    throw \"Amplitude out of range (0..1).\";\n  }\n};\n  \n/**\n * Set the frequency of the signal\n *\n * @param {Number} frequency The frequency of the signal\n */  \nOscillator.prototype.setFreq = function(frequency) {\n  this.frequency = frequency;\n  this.cyclesPerSample = frequency / this.sampleRate;\n};\n     \n// Add an oscillator\nOscillator.prototype.add = function(oscillator) {\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //this.signal[i] += oscillator.valueAt(i);\n    this.signal[i] += oscillator.signal[i];\n  }\n \n  return this.signal;\n};\n     \n// Add a signal to the current generated osc signal\nOscillator.prototype.addSignal = function(signal) {\n  for ( var i = 0; i < signal.length; i++ ) {\n    if ( i >= this.bufferSize ) {\n      break;\n    }\n    this.signal[i] += signal[i];\n   \n    /*\n    // Constrain amplitude\n    if ( this.signal[i] > 1 ) {\n      this.signal[i] = 1;\n    } else if ( this.signal[i] < -1 ) {\n      this.signal[i] = -1;\n    }\n    */\n  }\n  return this.signal;\n};\n     \n// Add an envelope to the oscillator\nOscillator.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nOscillator.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n};\n     \nOscillator.prototype.valueAt = function(offset) {\n  return this.waveTable[offset % this.waveTableLength];\n};\n     \nOscillator.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n  var step = this.waveTableLength * this.frequency / this.sampleRate;\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //var step = (frameOffset + i) * this.cyclesPerSample % 1;\n    //this.signal[i] = this.func(step) * this.amplitude;\n    //this.signal[i] = this.valueAt(Math.round((frameOffset + i) * step)) * this.amplitude;\n    offset = Math.round((frameOffset + i) * step);\n    this.signal[i] = this.waveTable[offset % this.waveTableLength] * this.amplitude;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nOscillator.Sine = function(step) {\n  return Math.sin(DSP.TWO_PI * step);\n};\n\nOscillator.Square = function(step) {\n  return step < 0.5 ? 1 : -1;\n};\n\nOscillator.Saw = function(step) {\n  return 2 * (step - Math.round(step));\n};\n\nOscillator.Triangle = function(step) {\n  return 1 - 4 * Math.abs(Math.round(step) - step);\n};\n\nOscillator.Pulse = function(step) {\n  // stub\n};\n \nfunction ADSR(attackLength, decayLength, sustainLevel, sustainLength, releaseLength, sampleRate) {\n  this.sampleRate = sampleRate;\n  // Length in seconds\n  this.attackLength  = attackLength;\n  this.decayLength   = decayLength;\n  this.sustainLevel  = sustainLevel;\n  this.sustainLength = sustainLength;\n  this.releaseLength = releaseLength;\n  this.sampleRate    = sampleRate;\n \n  // Length in samples\n  this.attackSamples  = attackLength  * sampleRate;\n  this.decaySamples   = decayLength   * sampleRate;\n  this.sustainSamples = sustainLength * sampleRate;\n  this.releaseSamples = releaseLength * sampleRate;\n \n  // Updates the envelope sample positions\n  this.update = function() {\n    this.attack         =                this.attackSamples;\n    this.decay          = this.attack  + this.decaySamples;\n    this.sustain        = this.decay   + this.sustainSamples;\n    this.release        = this.sustain + this.releaseSamples;\n  };\n \n  this.update();\n \n  this.samplesProcessed = 0;\n}\n\nADSR.prototype.noteOn = function() {\n  this.samplesProcessed = 0;\n  this.sustainSamples = this.sustainLength * this.sampleRate;\n  this.update();\n};\n\n// Send a note off when using a sustain of infinity to let the envelope enter the release phase\nADSR.prototype.noteOff = function() {\n  this.sustainSamples = this.samplesProcessed - this.decaySamples;\n  this.update();\n};\n\nADSR.prototype.processSample = function(sample) {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return sample * amplitude;\n};\n\nADSR.prototype.value = function() {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return amplitude;\n};\n     \nADSR.prototype.process = function(buffer) {\n  for ( var i = 0; i < buffer.length; i++ ) {\n    buffer[i] *= this.value();\n\n    this.samplesProcessed++;\n  }\n \n  return buffer;\n};\n     \n     \nADSR.prototype.isActive = function() {\n  if ( this.samplesProcessed > this.release || this.samplesProcessed === -1 ) {\n    return false;\n  } else {\n    return true;\n  }\n};\n\nADSR.prototype.disable = function() {\n  this.samplesProcessed = -1;\n};\n \nfunction IIRFilter(type, cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n\n  switch(type) {\n    case DSP.LOWPASS:\n    case DSP.LP12:\n      this.func = new IIRFilter.LP12(cutoff, resonance, sampleRate);\n      break;\n  }\n}\n\nIIRFilter.prototype.__defineGetter__('cutoff',\n  function() {\n    return this.func.cutoff;\n  }\n);\n\nIIRFilter.prototype.__defineGetter__('resonance',\n  function() {\n    return this.func.resonance;\n  }\n);\n\nIIRFilter.prototype.set = function(cutoff, resonance) {\n  this.func.calcCoeff(cutoff, resonance);\n};\n\nIIRFilter.prototype.process = function(buffer) {\n  this.func.process(buffer);\n};\n\n// Add an envelope to the filter\nIIRFilter.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.func.addEnvelope(envelope);\n  } else {\n    throw \"Not an envelope.\";\n  }\n};\n\nIIRFilter.LP12 = function(cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n  this.vibraPos   = 0;\n  this.vibraSpeed = 0;\n  this.envelope = false;\n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.w = 2.0 * Math.PI * cutoff / this.sampleRate;\n    this.q = 1.0 - this.w / (2.0 * (resonance + 0.5 / (1.0 + this.w)) + this.w - 2.0);\n    this.r = this.q * this.q;\n    this.c = this.r + 1.0 - 2.0 * Math.cos(this.w) * this.q;\n   \n    this.cutoff = cutoff;\n    this.resonance = resonance;\n  };\n\n  this.calcCoeff(cutoff, resonance);\n\n  this.process = function(buffer) {\n    for ( var i = 0; i < buffer.length; i++ ) {\n      this.vibraSpeed += (buffer[i] - this.vibraPos) * this.c;\n      this.vibraPos   += this.vibraSpeed;\n      this.vibraSpeed *= this.r;\n   \n      /*\n      var temp = this.vibraPos;\n     \n      if ( temp > 1.0 ) {\n        temp = 1.0;\n      } else if ( temp < -1.0 ) {\n        temp = -1.0;\n      } else if ( temp != temp ) {\n        temp = 1;\n      }\n     \n      buffer[i] = temp;\n      */\n\n      if (this.envelope) {\n        buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (this.vibraPos * this.envelope.value());\n        this.envelope.samplesProcessed++;\n      } else {\n        buffer[i] = this.vibraPos;\n      }\n    }\n  };\n}; \n\nIIRFilter.LP12.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nfunction IIRFilter2(type, cutoff, resonance, sampleRate) {\n  this.type = type;\n  this.cutoff = cutoff;\n  this.resonance = resonance;\n  this.sampleRate = sampleRate;\n\n  this.f = Float32Array(4);\n  this.f[0] = 0.0; // lp\n  this.f[1] = 0.0; // hp\n  this.f[2] = 0.0; // bp\n  this.f[3] = 0.0; // br \n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.freq = 2 * Math.sin(Math.PI * Math.min(0.25, cutoff/(this.sampleRate*2)));  \n    this.damp = Math.min(2 * (1 - Math.pow(resonance, 0.25)), Math.min(2, 2/this.freq - this.freq * 0.5));\n  };\n\n  this.calcCoeff(cutoff, resonance);\n}\n\nIIRFilter2.prototype.process = function(buffer) {\n  var input, output;\n  var f = this.f;\n\n  for ( var i = 0; i < buffer.length; i++ ) {\n    input = buffer[i];\n\n    // first pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output = 0.5 * f[this.type];\n\n    // second pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output += 0.5 * f[this.type];\n\n    if (this.envelope) {\n      buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (output * this.envelope.value());\n      this.envelope.samplesProcessed++;\n    } else {\n      buffer[i] = output;\n    }\n  }\n};\n\nIIRFilter2.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.envelope = envelope;\n  } else {\n    throw \"This is not an envelope.\";\n  }\n};\n\nIIRFilter2.prototype.set = function(cutoff, resonance) {\n  this.calcCoeff(cutoff, resonance);\n};\n\n\n\nfunction WindowFunction(type, alpha) {\n  this.alpha = alpha;\n \n  switch(type) {\n    case DSP.BARTLETT:\n      this.func = WindowFunction.Bartlett;\n      break;\n     \n    case DSP.BARTLETTHANN:\n      this.func = WindowFunction.BartlettHann;\n      break;\n     \n    case DSP.BLACKMAN:\n      this.func = WindowFunction.Blackman;\n      this.alpha = this.alpha || 0.16;\n      break;\n   \n    case DSP.COSINE:\n      this.func = WindowFunction.Cosine;\n      break;\n     \n    case DSP.GAUSS:\n      this.func = WindowFunction.Gauss;\n      this.alpha = this.alpha || 0.25;\n      break;\n     \n    case DSP.HAMMING:\n      this.func = WindowFunction.Hamming;\n      break;\n     \n    case DSP.HANN:\n      this.func = WindowFunction.Hann;\n      break;\n   \n    case DSP.LANCZOS:\n      this.func = WindowFunction.Lanczoz;\n      break;\n     \n    case DSP.RECTANGULAR:\n      this.func = WindowFunction.Rectangular;\n      break;\n     \n    case DSP.TRIANGULAR:\n      this.func = WindowFunction.Triangular;\n      break;\n  }\n}\n\nWindowFunction.prototype.process = function(buffer) {\n  var length = buffer.length;\n  for ( var i = 0; i < length; i++ ) {\n    buffer[i] *= this.func(length, i, this.alpha);\n  }\n  return buffer;\n};\n\nWindowFunction.Bartlett = function(length, index) {\n  return 2 / (length - 1) * ((length - 1) / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nWindowFunction.BartlettHann = function(length, index) {\n  return 0.62 - 0.48 * Math.abs(index / (length - 1) - 0.5) - 0.38 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Blackman = function(length, index, alpha) {\n  var a0 = (1 - alpha) / 2;\n  var a1 = 0.5;\n  var a2 = alpha / 2;\n\n  return a0 - a1 * Math.cos(DSP.TWO_PI * index / (length - 1)) + a2 * Math.cos(4 * Math.PI * index / (length - 1));\n};\n\nWindowFunction.Cosine = function(length, index) {\n  return Math.cos(Math.PI * index / (length - 1) - Math.PI / 2);\n};\n\nWindowFunction.Gauss = function(length, index, alpha) {\n  return Math.pow(Math.E, -0.5 * Math.pow((index - (length - 1) / 2) / (alpha * (length - 1) / 2), 2));\n};\n\nWindowFunction.Hamming = function(length, index) {\n  return 0.54 - 0.46 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Hann = function(length, index) {\n  return 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));\n};\n\nWindowFunction.Lanczos = function(length, index) {\n  var x = 2 * index / (length - 1) - 1;\n  return Math.sin(Math.PI * x) / (Math.PI * x);\n};\n\nWindowFunction.Rectangular = function(length, index) {\n  return 1;\n};\n\nWindowFunction.Triangular = function(length, index) {\n  return 2 / length * (length / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nfunction sinh (arg) {\n  // Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2 \n  //\n  // version: 1004.2314\n  // discuss at: http://phpjs.org/functions/sinh    // +   original by: Onno Marsman\n  // *     example 1: sinh(-0.9834330348825909);\n  // *     returns 1: -1.1497971402636502\n  return (Math.exp(arg) - Math.exp(-arg))/2;\n}\n\n/* \n *  Biquad filter\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\n// Implementation based on:\n// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt\nfunction Biquad(type, sampleRate) {\n  this.Fs = sampleRate;\n  this.type = type;  // type of the filter\n  this.parameterType = DSP.Q; // type of the parameter\n\n  this.x_1_l = 0;\n  this.x_2_l = 0;\n  this.y_1_l = 0;\n  this.y_2_l = 0;\n\n  this.x_1_r = 0;\n  this.x_2_r = 0;\n  this.y_1_r = 0;\n  this.y_2_r = 0;\n\n  this.b0 = 1;\n  this.a0 = 1;\n\n  this.b1 = 0;\n  this.a1 = 0;\n\n  this.b2 = 0;\n  this.a2 = 0;\n\n  this.b0a0 = this.b0 / this.a0;\n  this.b1a0 = this.b1 / this.a0;\n  this.b2a0 = this.b2 / this.a0;\n  this.a1a0 = this.a1 / this.a0;\n  this.a2a0 = this.a2 / this.a0;\n\n  this.f0 = 3000;   // \"wherever it's happenin', man.\"  Center Frequency or\n                    // Corner Frequency, or shelf midpoint frequency, depending\n                    // on which filter type.  The \"significant frequency\".\n\n  this.dBgain = 12; // used only for peaking and shelving filters\n\n  this.Q = 1;       // the EE kind of definition, except for peakingEQ in which A*Q is\n                    // the classic EE Q.  That adjustment in definition was made so that\n                    // a boost of N dB followed by a cut of N dB for identical Q and\n                    // f0/Fs results in a precisely flat unity gain filter or \"wire\".\n\n  this.BW = -3;     // the bandwidth in octaves (between -3 dB frequencies for BPF\n                    // and notch or between midpoint (dBgain/2) gain frequencies for\n                    // peaking EQ\n\n  this.S = 1;       // a \"shelf slope\" parameter (for shelving EQ only).  When S = 1,\n                    // the shelf slope is as steep as it can be and remain monotonically\n                    // increasing or decreasing gain with frequency.  The shelf slope, in\n                    // dB/octave, remains proportional to S for all other values for a\n                    // fixed f0/Fs and dBgain.\n\n  this.coefficients = function() {\n    var b = [this.b0, this.b1, this.b2];\n    var a = [this.a0, this.a1, this.a2];\n    return {b: b, a:a};\n  };\n\n  this.setFilterType = function(type) {\n    this.type = type;\n    this.recalculateCoefficients();\n  };\n\n  this.setSampleRate = function(rate) {\n    this.Fs = rate;\n    this.recalculateCoefficients();\n  };\n\n  this.setQ = function(q) {\n    this.parameterType = DSP.Q;\n    this.Q = Math.max(Math.min(q, 115.0), 0.001);\n    this.recalculateCoefficients();\n  };\n\n  this.setBW = function(bw) {\n    this.parameterType = DSP.BW;\n    this.BW = bw;\n    this.recalculateCoefficients();\n  };\n\n  this.setS = function(s) {\n    this.parameterType = DSP.S;\n    this.S = Math.max(Math.min(s, 5.0), 0.0001);\n    this.recalculateCoefficients();\n  };\n\n  this.setF0 = function(freq) {\n    this.f0 = freq;\n    this.recalculateCoefficients();\n  }; \n \n  this.setDbGain = function(g) {\n    this.dBgain = g;\n    this.recalculateCoefficients();\n  };\n\n  this.recalculateCoefficients = function() {\n    var A;\n    if (type === DSP.PEAKING_EQ || type === DSP.LOW_SHELF || type === DSP.HIGH_SHELF ) {\n      A = Math.pow(10, (this.dBgain/40));  // for peaking and shelving EQ filters only\n    } else {\n      A  = Math.sqrt( Math.pow(10, (this.dBgain/20)) );   \n    }\n\n    var w0 = DSP.TWO_PI * this.f0 / this.Fs;\n\n    var cosw0 = Math.cos(w0);\n    var sinw0 = Math.sin(w0);\n\n    var alpha = 0;\n   \n    switch (this.parameterType) {\n      case DSP.Q:\n        alpha = sinw0/(2*this.Q);\n        break;\n           \n      case DSP.BW:\n        alpha = sinw0 * sinh( Math.LN2/2 * this.BW * w0/sinw0 );\n        break;\n\n      case DSP.S:\n        alpha = sinw0/2 * Math.sqrt( (A + 1/A)*(1/this.S - 1) + 2 );\n        break;\n    }\n\n    /**\n        FYI: The relationship between bandwidth and Q is\n             1/Q = 2*sinh(ln(2)/2*BW*w0/sin(w0))     (digital filter w BLT)\n        or   1/Q = 2*sinh(ln(2)/2*BW)             (analog filter prototype)\n\n        The relationship between shelf slope and Q is\n             1/Q = sqrt((A + 1/A)*(1/S - 1) + 2)\n    */\n\n    var coeff;\n\n    switch (this.type) {\n      case DSP.LPF:       // H(s) = 1 / (s^2 + s/Q + 1)\n        this.b0 =  (1 - cosw0)/2;\n        this.b1 =   1 - cosw0;\n        this.b2 =  (1 - cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.HPF:       // H(s) = s^2 / (s^2 + s/Q + 1)\n        this.b0 =  (1 + cosw0)/2;\n        this.b1 = -(1 + cosw0);\n        this.b2 =  (1 + cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_SKIRT:       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\n        this.b0 =   sinw0/2;\n        this.b1 =   0;\n        this.b2 =  -sinw0/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_PEAK:       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\n        this.b0 =   alpha;\n        this.b1 =   0;\n        this.b2 =  -alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.NOTCH:     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.APF:       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1 - alpha;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 + alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.PEAKING_EQ:  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\n        this.b0 =   1 + alpha*A;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 - alpha*A;\n        this.a0 =   1 + alpha/A;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha/A;\n        break;\n\n      case DSP.LOW_SHELF:   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) - (A-1)*cosw0 + coeff);\n        this.b1 =  2*A*((A-1) - (A+1)*cosw0);\n        this.b2 =    A*((A+1) - (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) + (A-1)*cosw0 + coeff;\n        this.a1 =   -2*((A-1) + (A+1)*cosw0);\n        this.a2 =       (A+1) + (A-1)*cosw0 - coeff;\n        break;\n\n      case DSP.HIGH_SHELF:   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) + (A-1)*cosw0 + coeff);\n        this.b1 = -2*A*((A-1) + (A+1)*cosw0);\n        this.b2 =    A*((A+1) + (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) - (A-1)*cosw0 + coeff;\n        this.a1 =    2*((A-1) - (A+1)*cosw0);\n        this.a2 =       (A+1) - (A-1)*cosw0 - coeff;\n        break;\n    }\n   \n    this.b0a0 = this.b0/this.a0;\n    this.b1a0 = this.b1/this.a0;\n    this.b2a0 = this.b2/this.a0;\n    this.a1a0 = this.a1/this.a0;\n    this.a2a0 = this.a2/this.a0;\n  };\n\n  this.process = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n\n      for ( var i=0; i<buffer.length; i++ ) {\n        output[i] = this.b0a0*buffer[i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[i];\n      }\n\n      return output;\n  };\n\n  this.processStereo = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n     \n      for (var i = 0; i < len/2; i++) {\n        output[2*i] = this.b0a0*buffer[2*i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[2*i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[2*i];\n\n        output[2*i+1] = this.b0a0*buffer[2*i+1] + this.b1a0*this.x_1_r + this.b2a0*this.x_2_r - this.a1a0*this.y_1_r - this.a2a0*this.y_2_r;\n        this.y_2_r = this.y_1_r;\n        this.y_1_r = output[2*i+1];\n        this.x_2_r = this.x_1_r;\n        this.x_1_r = buffer[2*i+1];\n      }\n\n      return output;\n  };\n}\n\n/* \n *  Magnitude to decibels\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  @buffer array of magnitudes to convert to decibels\n *\n *  @returns the array in decibels\n *\n */\nDSP.mag2db = function(buffer) {\n  var minDb = -120;\n  var minMag = Math.pow(10.0, minDb / 20.0);\n\n  var log = Math.log;\n  var max = Math.max;\n \n  var result = Float32Array(buffer.length);\n  for (var i=0; i<buffer.length; i++) {\n    result[i] = 20.0*log(max(buffer[i], minMag));\n  }\n\n  return result;\n};\n\n/* \n *  Frequency response\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  Calculates the frequency response at the given points.\n *\n *  @b b coefficients of the filter\n *  @a a coefficients of the filter\n *  @w w points (normally between -PI and PI) where to calculate the frequency response\n *\n *  @returns the frequency response in magnitude\n *\n */\nDSP.freqz = function(b, a, w) {\n  var i, j;\n\n  if (!w) {\n    w = Float32Array(200);\n    for (i=0;i<w.length; i++) {\n      w[i] = DSP.TWO_PI/w.length * i - Math.PI;\n    }\n  }\n\n  var result = Float32Array(w.length);\n \n  var sqrt = Math.sqrt;\n  var cos = Math.cos;\n  var sin = Math.sin;\n \n  for (i=0; i<w.length; i++) {\n    var numerator = {real:0.0, imag:0.0};\n    for (j=0; j<b.length; j++) {\n      numerator.real += b[j] * cos(-j*w[i]);\n      numerator.imag += b[j] * sin(-j*w[i]);\n    }\n\n    var denominator = {real:0.0, imag:0.0};\n    for (j=0; j<a.length; j++) {\n      denominator.real += a[j] * cos(-j*w[i]);\n      denominator.imag += a[j] * sin(-j*w[i]);\n    }\n \n    result[i] =  sqrt(numerator.real*numerator.real + numerator.imag*numerator.imag) / sqrt(denominator.real*denominator.real + denominator.imag*denominator.imag);\n  }\n\n  return result;\n};\n\n/* \n *  Graphical Equalizer\n *\n *  Implementation of a graphic equalizer with a configurable bands-per-octave\n *  and minimum and maximum frequencies\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\nfunction GraphicalEq(sampleRate) {\n  this.FS = sampleRate;\n  this.minFreq = 40.0;\n  this.maxFreq = 16000.0;\n\n  this.bandsPerOctave = 1.0;\n\n  this.filters = [];\n  this.freqzs = [];\n\n  this.calculateFreqzs = true;\n\n  this.recalculateFilters = function() {\n    var bandCount = Math.round(Math.log(this.maxFreq/this.minFreq) * this.bandsPerOctave/ Math.LN2);\n\n    this.filters = [];\n    for (var i=0; i<bandCount; i++) {\n      var freq = this.minFreq*(Math.pow(2, i/this.bandsPerOctave));\n      var newFilter = new Biquad(DSP.PEAKING_EQ, this.FS);\n      newFilter.setDbGain(0);\n      newFilter.setBW(1/this.bandsPerOctave);\n      newFilter.setF0(freq);\n      this.filters[i] = newFilter;\n      this.recalculateFreqz(i);\n    }\n  };\n\n  this.setMinimumFrequency = function(freq) {\n    this.minFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setMaximumFrequency = function(freq) {\n    this.maxFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setBandsPerOctave = function(bands) {\n    this.bandsPerOctave = bands;\n    this.recalculateFilters();\n  };\n\n  this.setBandGain = function(bandIndex, gain) {\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds.\";\n    }\n\n    if (!gain) {\n      throw \"A gain must be passed.\";\n    }\n   \n    this.filters[bandIndex].setDbGain(gain);\n    this.recalculateFreqz(bandIndex);\n  };\n \n  this.recalculateFreqz = function(bandIndex) {\n    if (!this.calculateFreqzs) {\n      return;\n    }\n\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds. \" + bandIndex + \" is out of [\" + 0 + \", \" + this.filters.length-1 + \"]\";\n    }\n       \n    if (!this.w) {\n      this.w = Float32Array(400);\n      for (var i=0; i<this.w.length; i++) {\n         this.w[i] = Math.PI/this.w.length * i;\n      }\n    }\n   \n    var b = [this.filters[bandIndex].b0, this.filters[bandIndex].b1, this.filters[bandIndex].b2];\n    var a = [this.filters[bandIndex].a0, this.filters[bandIndex].a1, this.filters[bandIndex].a2];\n\n    this.freqzs[bandIndex] = DSP.mag2db(DSP.freqz(b, a, this.w));\n  };\n\n  this.process = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].process(output);\n    }\n\n    return output;\n  };\n\n  this.processStereo = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].processStereo(output);\n    }\n\n    return output;\n  };\n}\n\n/**\n * MultiDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/delay-firefox-audio-api/\n *\n * This is a delay that feeds it's own delayed signal back into its circular\n * buffer. Also known as a CombFilter.\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\nfunction MultiDelay(maxDelayInSamplesSize, delayInSamples, masterVolume, delayVolume) {\n  this.delayBufferSamples   = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer     = delayInSamples;\n  this.delayOutputPointer   = 0;\n \n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.delayVolume     = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nMultiDelay.prototype.setDelayInSamples = function (delayInSamples) {\n  this.delayInSamples = delayInSamples;\n \n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setMasterVolume = function(masterVolume) {\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the delay feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and adds the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nMultiDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = (this.delayBufferSamples[this.delayOutputPointer] === null ? 0.0 : this.delayBufferSamples[this.delayOutputPointer]);\n   \n    // Mix normal audio data with delayed audio\n    var sample = (delaySample * this.delayVolume) + samples[i];\n   \n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = sample;\n   \n    // Return the audio with delay mix\n    outputSamples[i] = sample * this.masterVolume;\n   \n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * SingleDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: See usage in Reverb class\n *\n * This is a delay that does NOT feeds it's own delayed signal back into its \n * circular buffer, neither does it return the original signal. Also known as\n * an AllPassFilter(?).\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\n\nfunction SingleDelay(maxDelayInSamplesSize, delayInSamples, delayVolume) {\n  this.delayBufferSamples = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer  = delayInSamples;\n  this.delayOutputPointer = 0;\n \n  this.delayInSamples     = delayInSamples;\n  this.delayVolume        = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nSingleDelay.prototype.setDelayInSamples = function(delayInSamples) {\n  this.delayInSamples = delayInSamples;\n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the return signal volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nSingleDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and\n * returns the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nSingleDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n\n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = samples[i];\n   \n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = this.delayBufferSamples[this.delayOutputPointer];\n\n    // Return the audio with delay mix\n    outputSamples[i] = delaySample * this.delayVolume;\n\n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * Reverb effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/reverb-firefox-audio-api/\n *\n * This reverb consists of 6 SingleDelays, 6 MultiDelays and an IIRFilter2\n * for each of the two stereo channels.\n *\n * Compatible with interleaved stereo buffers only!\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffers)\n * @param {Number} delayInSamples Initial delay in samples for internal (Single/Multi)delays\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} mixVolume Initial reverb signal mix volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume for internal (Single/Multi)delays. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} dampFrequency Initial low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n *\n * @constructor\n */\nfunction Reverb(maxDelayInSamplesSize, delayInSamples, masterVolume, mixVolume, delayVolume, dampFrequency) {\n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.mixVolume       = mixVolume;\n  this.delayVolume     = delayVolume;\n  this.dampFrequency     = dampFrequency;\n \n  this.NR_OF_MULTIDELAYS = 6;\n  this.NR_OF_SINGLEDELAYS = 6;\n \n  this.LOWPASSL = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n  this.LOWPASSR = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n \n  this.singleDelays = [];\n  \n  var i, delayMultiply;\n\n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i] = new SingleDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.delayVolume);\n  }\n \n  this.multiDelays = [];\n\n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2... \n    this.multiDelays[i] = new MultiDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.masterVolume, this.delayVolume);\n  }\n}\n\n/**\n * Change the delay time in samples as a base for all delays.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nReverb.prototype.setDelayInSamples = function (delayInSamples){\n  this.delayInSamples = delayInSamples;\n\n  var i, delayMultiply;\n \n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n   \n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2...\n    this.multiDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMasterVolume = function (masterVolume){\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the reverb signal mix level.\n *\n * @param {Number} mixVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMixVolume = function (mixVolume){\n  this.mixVolume = mixVolume;\n};\n\n/**\n * Change all delays feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setDelayVolume = function (delayVolume){\n  this.delayVolume = delayVolume;\n \n  var i;\n\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    this.singleDelays[i].setDelayVolume(this.delayVolume);\n  } \n \n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    this.multiDelays[i].setDelayVolume(this.delayVolume);\n  } \n};\n\n/**\n * Change the Low Pass filter frequency.\n *\n * @param {Number} dampFrequency low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n */\nReverb.prototype.setDampFrequency = function (dampFrequency){\n  this.dampFrequency = dampFrequency;\n \n  this.LOWPASSL.set(dampFrequency, 0);\n  this.LOWPASSR.set(dampFrequency, 0); \n};\n\n/**\n * Process a given interleaved float value Array and copies and adds the reverb signal.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved buffer.\n */\nReverb.prototype.process = function (interleavedSamples){ \n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(interleavedSamples.length);\n \n  // Perform low pass on the input samples to mimick damp\n  var leftRightMix = DSP.deinterleave(interleavedSamples);\n  this.LOWPASSL.process( leftRightMix[DSP.LEFT] );\n  this.LOWPASSR.process( leftRightMix[DSP.RIGHT] ); \n  var filteredSamples = DSP.interleave(leftRightMix[DSP.LEFT], leftRightMix[DSP.RIGHT]);\n\n  var i;\n\n  // Process MultiDelays in parallel\n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    // Invert the signal of every even multiDelay\n    outputSamples = DSP.mixSampleBuffers(outputSamples, this.multiDelays[i].process(filteredSamples), 2%i === 0, this.NR_OF_MULTIDELAYS);\n  }\n \n  // Process SingleDelays in series\n  var singleDelaySamples = new Float32Array(outputSamples.length);\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    // Invert the signal of every even singleDelay\n    singleDelaySamples = DSP.mixSampleBuffers(singleDelaySamples, this.singleDelays[i].process(outputSamples), 2%i === 0, 1);\n  }\n\n  // Apply the volume of the reverb signal\n  for (i = 0; i<singleDelaySamples.length; i++) {\n    singleDelaySamples[i] *= this.mixVolume;\n  }\n \n  // Mix the original signal with the reverb signal\n  outputSamples = DSP.mixSampleBuffers(singleDelaySamples, interleavedSamples, 0, 1);\n\n  // Apply the master volume to the complete signal\n  for (i = 0; i<outputSamples.length; i++) {\n    outputSamples[i] *= this.masterVolume;\n  }\n   \n  return outputSamples;\n};\n\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "LevelOfDetail/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "LevelOfDetail/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "LevelOfDetail/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "LevelOfDetail/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "LevelOfDetail/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "MeshLife/bundle.js",
    "content": "(function(){var require = function (file, cwd) {\n    var resolved = require.resolve(file, cwd || '/');\n    var mod = require.modules[resolved];\n    if (!mod) throw new Error(\n        'Failed to resolve module ' + file + ', tried ' + resolved\n    );\n    var cached = require.cache[resolved];\n    var res = cached? cached.exports : mod();\n    return res;\n};\n\nrequire.paths = [];\nrequire.modules = {};\nrequire.cache = {};\nrequire.extensions = [\".js\",\".coffee\",\".json\"];\n\nrequire._core = {\n    'assert': true,\n    'events': true,\n    'fs': true,\n    'path': true,\n    'vm': true\n};\n\nrequire.resolve = (function () {\n    return function (x, cwd) {\n        if (!cwd) cwd = '/';\n        \n        if (require._core[x]) return x;\n        var path = require.modules.path();\n        cwd = path.resolve('/', cwd);\n        var y = cwd || '/';\n        \n        if (x.match(/^(?:\\.\\.?\\/|\\/)/)) {\n            var m = loadAsFileSync(path.resolve(y, x))\n                || loadAsDirectorySync(path.resolve(y, x));\n            if (m) return m;\n        }\n        \n        var n = loadNodeModulesSync(x, y);\n        if (n) return n;\n        \n        throw new Error(\"Cannot find module '\" + x + \"'\");\n        \n        function loadAsFileSync (x) {\n            x = path.normalize(x);\n            if (require.modules[x]) {\n                return x;\n            }\n            \n            for (var i = 0; i < require.extensions.length; i++) {\n                var ext = require.extensions[i];\n                if (require.modules[x + ext]) return x + ext;\n            }\n        }\n        \n        function loadAsDirectorySync (x) {\n            x = x.replace(/\\/+$/, '');\n            var pkgfile = path.normalize(x + '/package.json');\n            if (require.modules[pkgfile]) {\n                var pkg = require.modules[pkgfile]();\n                var b = pkg.browserify;\n                if (typeof b === 'object' && b.main) {\n                    var m = loadAsFileSync(path.resolve(x, b.main));\n                    if (m) return m;\n                }\n                else if (typeof b === 'string') {\n                    var m = loadAsFileSync(path.resolve(x, b));\n                    if (m) return m;\n                }\n                else if (pkg.main) {\n                    var m = loadAsFileSync(path.resolve(x, pkg.main));\n                    if (m) return m;\n                }\n            }\n            \n            return loadAsFileSync(x + '/index');\n        }\n        \n        function loadNodeModulesSync (x, start) {\n            var dirs = nodeModulesPathsSync(start);\n            for (var i = 0; i < dirs.length; i++) {\n                var dir = dirs[i];\n                var m = loadAsFileSync(dir + '/' + x);\n                if (m) return m;\n                var n = loadAsDirectorySync(dir + '/' + x);\n                if (n) return n;\n            }\n            \n            var m = loadAsFileSync(x);\n            if (m) return m;\n        }\n        \n        function nodeModulesPathsSync (start) {\n            var parts;\n            if (start === '/') parts = [ '' ];\n            else parts = path.normalize(start).split('/');\n            \n            var dirs = [];\n            for (var i = parts.length - 1; i >= 0; i--) {\n                if (parts[i] === 'node_modules') continue;\n                var dir = parts.slice(0, i + 1).join('/') + '/node_modules';\n                dirs.push(dir);\n            }\n            \n            return dirs;\n        }\n    };\n})();\n\nrequire.alias = function (from, to) {\n    var path = require.modules.path();\n    var res = null;\n    try {\n        res = require.resolve(from + '/package.json', '/');\n    }\n    catch (err) {\n        res = require.resolve(from, '/');\n    }\n    var basedir = path.dirname(res);\n    \n    var keys = (Object.keys || function (obj) {\n        var res = [];\n        for (var key in obj) res.push(key);\n        return res;\n    })(require.modules);\n    \n    for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        if (key.slice(0, basedir.length + 1) === basedir + '/') {\n            var f = key.slice(basedir.length);\n            require.modules[to + f] = require.modules[basedir + f];\n        }\n        else if (key === basedir) {\n            require.modules[to] = require.modules[basedir];\n        }\n    }\n};\n\n(function () {\n    var process = {};\n    var global = typeof window !== 'undefined' ? window : {};\n    var definedProcess = false;\n    \n    require.define = function (filename, fn) {\n        if (!definedProcess && require.modules.__browserify_process) {\n            process = require.modules.__browserify_process();\n            definedProcess = true;\n        }\n        \n        var dirname = require._core[filename]\n            ? ''\n            : require.modules.path().dirname(filename)\n        ;\n        \n        var require_ = function (file) {\n            var requiredModule = require(file, dirname);\n            var cached = require.cache[require.resolve(file, dirname)];\n\n            if (cached && cached.parent === null) {\n                cached.parent = module_;\n            }\n\n            return requiredModule;\n        };\n        require_.resolve = function (name) {\n            return require.resolve(name, dirname);\n        };\n        require_.modules = require.modules;\n        require_.define = require.define;\n        require_.cache = require.cache;\n        var module_ = {\n            id : filename,\n            filename: filename,\n            exports : {},\n            loaded : false,\n            parent: null\n        };\n        \n        require.modules[filename] = function () {\n            require.cache[filename] = module_;\n            fn.call(\n                module_.exports,\n                require_,\n                module_,\n                module_.exports,\n                dirname,\n                filename,\n                process,\n                global\n            );\n            module_.loaded = true;\n            return module_.exports;\n        };\n    };\n})();\n\n\nrequire.define(\"path\",function(require,module,exports,__dirname,__filename,process,global){function filter (xs, fn) {\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (fn(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length; i >= 0; i--) {\n    var last = parts[i];\n    if (last == '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Regex to split a filename into [*, dir, basename, ext]\n// posix version\nvar splitPathRe = /^(.+\\/(?!$)|\\/)?((?:.+?)?(\\.[^.]*)?)$/;\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\nvar resolvedPath = '',\n    resolvedAbsolute = false;\n\nfor (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {\n  var path = (i >= 0)\n      ? arguments[i]\n      : process.cwd();\n\n  // Skip empty and invalid entries\n  if (typeof path !== 'string' || !path) {\n    continue;\n  }\n\n  resolvedPath = path + '/' + resolvedPath;\n  resolvedAbsolute = path.charAt(0) === '/';\n}\n\n// At this point the path should be resolved to a full absolute path, but\n// handle relative paths to be safe (might happen when process.cwd() fails)\n\n// Normalize the path\nresolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\nvar isAbsolute = path.charAt(0) === '/',\n    trailingSlash = path.slice(-1) === '/';\n\n// Normalize the path\npath = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n  \n  return (isAbsolute ? '/' : '') + path;\n};\n\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    return p && typeof p === 'string';\n  }).join('/'));\n};\n\n\nexports.dirname = function(path) {\n  var dir = splitPathRe.exec(path)[1] || '';\n  var isWindows = false;\n  if (!dir) {\n    // No dirname\n    return '.';\n  } else if (dir.length === 1 ||\n      (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {\n    // It is just a slash or a drive letter with a slash\n    return dir;\n  } else {\n    // It is a full dirname, strip trailing slash\n    return dir.substring(0, dir.length - 1);\n  }\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPathRe.exec(path)[2] || '';\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPathRe.exec(path)[3] || '';\n};\n\n});\n\nrequire.define(\"__browserify_process\",function(require,module,exports,__dirname,__filename,process,global){var process = module.exports = {};\n\nprocess.nextTick = (function () {\n    var canSetImmediate = typeof window !== 'undefined'\n        && window.setImmediate;\n    var canPost = typeof window !== 'undefined'\n        && window.postMessage && window.addEventListener\n    ;\n\n    if (canSetImmediate) {\n        return function (f) { return window.setImmediate(f) };\n    }\n\n    if (canPost) {\n        var queue = [];\n        window.addEventListener('message', function (ev) {\n            if (ev.source === window && ev.data === 'browserify-tick') {\n                ev.stopPropagation();\n                if (queue.length > 0) {\n                    var fn = queue.shift();\n                    fn();\n                }\n            }\n        }, true);\n\n        return function nextTick(fn) {\n            queue.push(fn);\n            window.postMessage('browserify-tick', '*');\n        };\n    }\n\n    return function nextTick(fn) {\n        setTimeout(fn, 0);\n    };\n})();\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\n\nprocess.binding = function (name) {\n    if (name === 'evals') return (require)('vm')\n    else throw new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n    var cwd = '/';\n    var path;\n    process.cwd = function () { return cwd };\n    process.chdir = function (dir) {\n        if (!path) path = require('path');\n        cwd = path.resolve(dir, cwd);\n    };\n})();\n\n});\n\nrequire.define(\"/node_modules/trimesh/package.json\",function(require,module,exports,__dirname,__filename,process,global){module.exports = {\"main\":\"index.js\"}\n});\n\nrequire.define(\"/node_modules/trimesh/index.js\",function(require,module,exports,__dirname,__filename,process,global){//Topology functions\nvar topology = require('./src/topology.js');\nexports.vertex_stars = topology.vertex_stars;\nexports.edges        = topology.edges;\n\n//Mesh repair\nvar repair = require('./src/repair.js');\nexports.fuse_vertices = repair.fuse_vertices;\n\n//Isosurface functions\nexports.marching_cubes = require('./src/marchingcubes.js').marching_cubes;\nexports.marching_tetrahedra = require('./src/marchingtetrahedra.js').marching_tetrahedra;\nexports.surface_nets = require('./src/surfacenets.js').surface_nets;\n\n//Surface normal estimation\nvar normals = require('./src/normals.js');\nexports.vertex_normals = normals.vertex_normals;\nexports.face_normals = normals.face_normals;\n\n//Surface distance\nexports.geodesic_distance = require('./src/distance.js').geodesic_distance;\n\n//Test shapes\nvar shapes = require('./src/shapes.js');\nexports.grid_mesh = shapes.grid_mesh;\nexports.cube_mesh = shapes.cube_mesh;\nexports.sphere_mesh = shapes.sphere_mesh;\n\n//Subdivisions\nexports.loop_subdivision = require('./src/loop_subdivision.js').loop_subdivision;\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/topology.js\",function(require,module,exports,__dirname,__filename,process,global){function vmax(faces) {\n  var vc = 0;\n  for(var i=0; i<faces.length; ++i) {\n    var f = faces[i];\n    for(var j=0; j<f.length; ++j) {\n      vc = Math.max(vc, f[j]);\n    }\n  }\n  return vc+1;\n}\n\n/**\n * Returns an array containing the set of all faces incident to each vertex in the mesh.\n */\nexports.vertex_stars = function(args) {\n  var faces         = args.faces;\n  var vertex_count  = args.vertex_count || vmax(faces);\n\n  var stars = new Array(vertex_count);\n  for(var i=0; i<stars.length; ++i) {\n    stars[i] = [];\n  }\n  \n  for(var i=0; i<faces.length; ++i) {  \n    var f = faces[i];\n    for(var j=0; j<f.length; ++j) {\n      stars[f[j]].push(i);\n    }\n  }\n  \n  return stars;\n};\n\n// Compute all edges of a mesh\nexports.edges = function(args) {\n  var faces = args.faces;\n  var edges = { };\n  \n  for(var i=0; i<faces.length; ++i) {\n    var f = faces[i];\n    for(var j=0; j<f.length; ++j) {\n      var e = [ f[j], f[(j+1)%f.length] ];\n      e.sort();\n      if(e in edges) {\n        edges[e].push(i);\n      } else {\n        edges[e] = [i];\n      }\n    }\n  }\n  \n  return edges;\n}\n\n\nvar edge_compare = new Function(\"a\", \"b\", \"return a[0] === b[0] ? a[1]-b[1] : a[0]-b[0];\");\n\n// Computes the 1-ring around each vertex\nexports.rings = function(args) {\n  var faces = args.faces;\n  var stars = args.stars || exports.vertex_stars(args);\n  var vertex_count = args.vertex_count || stars.length;\n  var rings = new Array(vertex_count);\n  \n  for(var i=0; i<vertex_count; ++i) {\n    var nbhd = stars[i];\n    var edges = [];\n    \n    for(var n=0; n<nbhd.length; ++n) {\n      var f = faces[nbhd[n]];\n      for(var j=0; j<f.length; ++j) {\n        var e = [f[j], f[(j+1)%3]];\n        e.sort();\n        edges.push(e);\n      }\n    }\n    \n    edges.sort(edge_compare);\n    \n    //Extract unique edges store in ring\n  }\n}\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/repair.js\",function(require,module,exports,__dirname,__filename,process,global){\"use strict\";\n\n//Fuses vertices in a mesh to remove cracks\nfunction fuse_vertices(args) {  \n  \n  //Unpack arguments\n  var positions   = args.positions;\n  var faces       = args.faces;\n  var tol         = args.tolerance || 1e-6;\n  \n  //First, fuse vertices together\n  var grid        = {};\n  var n_positions = [];\n  var n_index     = new Array(positions.length);\n  for(var i=0; i<positions.length; ++i) {\n\n    var p = positions[i];\n    var r = new Array(3);\n    for(var j=0; j<3; ++j) {\n      r[j] = Math.floor(p[j] / tol);\n    }\n    \n    if(r in grid) {\n      n_index[i] = grid[r];\n    } else {\n      var idx = n_positions.length;\n      grid[r] = idx;\n      n_index[i] = idx;\n      n_positions.push(p.slice(0));\n    }\n  }\n  \n  \n  //Then fix up faces\n  var n_faces = [];\n  for(var i=0; i<faces.length; ++i) {\n    var face = faces[i].slice(0);\n    var skip = false;\n    for(var j=0; j<face.length; ++j) {\n      face[j] = n_index[face[j]];\n      for(var k=0; k<j; ++k) {\n        if(face[j] === face[k]) {\n          skip = true;\n        }\n      }\n    }\n    \n    if(!skip) {\n      n_faces.push(face);\n    }\n  }\n  \n  //Return resulting mesh\n  return { positions: n_positions, faces: n_faces };\n};\n\nexports.fuse_vertices = fuse_vertices;\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/marchingcubes.js\",function(require,module,exports,__dirname,__filename,process,global){/**\n * Javascript Marching Cubes\n *\n * Based on Paul Bourke's classic implementation:\n *    http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * JS port by Mikola Lysenko\n */\n\nvar edgeTable= new Uint32Array([\n      0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n      0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n      0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n      0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n      0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n      0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n      0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n      0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n      0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n      0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n      0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n      0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n      0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n      0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n      0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n      0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n      0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n      0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n      0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n      0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n      0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n      0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n      0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n      0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n      0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n      0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n      0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n      0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n      0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n      0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n      0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n      0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   ])\n  , triTable = [\n      [],\n      [0, 8, 3],\n      [0, 1, 9],\n      [1, 8, 3, 9, 8, 1],\n      [1, 2, 10],\n      [0, 8, 3, 1, 2, 10],\n      [9, 2, 10, 0, 2, 9],\n      [2, 8, 3, 2, 10, 8, 10, 9, 8],\n      [3, 11, 2],\n      [0, 11, 2, 8, 11, 0],\n      [1, 9, 0, 2, 3, 11],\n      [1, 11, 2, 1, 9, 11, 9, 8, 11],\n      [3, 10, 1, 11, 10, 3],\n      [0, 10, 1, 0, 8, 10, 8, 11, 10],\n      [3, 9, 0, 3, 11, 9, 11, 10, 9],\n      [9, 8, 10, 10, 8, 11],\n      [4, 7, 8],\n      [4, 3, 0, 7, 3, 4],\n      [0, 1, 9, 8, 4, 7],\n      [4, 1, 9, 4, 7, 1, 7, 3, 1],\n      [1, 2, 10, 8, 4, 7],\n      [3, 4, 7, 3, 0, 4, 1, 2, 10],\n      [9, 2, 10, 9, 0, 2, 8, 4, 7],\n      [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n      [8, 4, 7, 3, 11, 2],\n      [11, 4, 7, 11, 2, 4, 2, 0, 4],\n      [9, 0, 1, 8, 4, 7, 2, 3, 11],\n      [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1],\n      [3, 10, 1, 3, 11, 10, 7, 8, 4],\n      [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4],\n      [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3],\n      [4, 7, 11, 4, 11, 9, 9, 11, 10],\n      [9, 5, 4],\n      [9, 5, 4, 0, 8, 3],\n      [0, 5, 4, 1, 5, 0],\n      [8, 5, 4, 8, 3, 5, 3, 1, 5],\n      [1, 2, 10, 9, 5, 4],\n      [3, 0, 8, 1, 2, 10, 4, 9, 5],\n      [5, 2, 10, 5, 4, 2, 4, 0, 2],\n      [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n      [9, 5, 4, 2, 3, 11],\n      [0, 11, 2, 0, 8, 11, 4, 9, 5],\n      [0, 5, 4, 0, 1, 5, 2, 3, 11],\n      [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5],\n      [10, 3, 11, 10, 1, 3, 9, 5, 4],\n      [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10],\n      [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3],\n      [5, 4, 8, 5, 8, 10, 10, 8, 11],\n      [9, 7, 8, 5, 7, 9],\n      [9, 3, 0, 9, 5, 3, 5, 7, 3],\n      [0, 7, 8, 0, 1, 7, 1, 5, 7],\n      [1, 5, 3, 3, 5, 7],\n      [9, 7, 8, 9, 5, 7, 10, 1, 2],\n      [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3],\n      [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2],\n      [2, 10, 5, 2, 5, 3, 3, 5, 7],\n      [7, 9, 5, 7, 8, 9, 3, 11, 2],\n      [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11],\n      [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7],\n      [11, 2, 1, 11, 1, 7, 7, 1, 5],\n      [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11],\n      [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0],\n      [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0],\n      [11, 10, 5, 7, 11, 5],\n      [10, 6, 5],\n      [0, 8, 3, 5, 10, 6],\n      [9, 0, 1, 5, 10, 6],\n      [1, 8, 3, 1, 9, 8, 5, 10, 6],\n      [1, 6, 5, 2, 6, 1],\n      [1, 6, 5, 1, 2, 6, 3, 0, 8],\n      [9, 6, 5, 9, 0, 6, 0, 2, 6],\n      [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n      [2, 3, 11, 10, 6, 5],\n      [11, 0, 8, 11, 2, 0, 10, 6, 5],\n      [0, 1, 9, 2, 3, 11, 5, 10, 6],\n      [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11],\n      [6, 3, 11, 6, 5, 3, 5, 1, 3],\n      [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6],\n      [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9],\n      [6, 5, 9, 6, 9, 11, 11, 9, 8],\n      [5, 10, 6, 4, 7, 8],\n      [4, 3, 0, 4, 7, 3, 6, 5, 10],\n      [1, 9, 0, 5, 10, 6, 8, 4, 7],\n      [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4],\n      [6, 1, 2, 6, 5, 1, 4, 7, 8],\n      [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7],\n      [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6],\n      [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n      [3, 11, 2, 7, 8, 4, 10, 6, 5],\n      [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11],\n      [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6],\n      [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6],\n      [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6],\n      [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11],\n      [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7],\n      [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n      [10, 4, 9, 6, 4, 10],\n      [4, 10, 6, 4, 9, 10, 0, 8, 3],\n      [10, 0, 1, 10, 6, 0, 6, 4, 0],\n      [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10],\n      [1, 4, 9, 1, 2, 4, 2, 6, 4],\n      [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4],\n      [0, 2, 4, 4, 2, 6],\n      [8, 3, 2, 8, 2, 4, 4, 2, 6],\n      [10, 4, 9, 10, 6, 4, 11, 2, 3],\n      [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6],\n      [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10],\n      [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1],\n      [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3],\n      [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1],\n      [3, 11, 6, 3, 6, 0, 0, 6, 4],\n      [6, 4, 8, 11, 6, 8],\n      [7, 10, 6, 7, 8, 10, 8, 9, 10],\n      [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10],\n      [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0],\n      [10, 6, 7, 10, 7, 1, 1, 7, 3],\n      [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7],\n      [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9],\n      [7, 8, 0, 7, 0, 6, 6, 0, 2],\n      [7, 3, 2, 6, 7, 2],\n      [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7],\n      [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7],\n      [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11],\n      [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1],\n      [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6],\n      [0, 9, 1, 11, 6, 7],\n      [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0],\n      [7, 11, 6],\n      [7, 6, 11],\n      [3, 0, 8, 11, 7, 6],\n      [0, 1, 9, 11, 7, 6],\n      [8, 1, 9, 8, 3, 1, 11, 7, 6],\n      [10, 1, 2, 6, 11, 7],\n      [1, 2, 10, 3, 0, 8, 6, 11, 7],\n      [2, 9, 0, 2, 10, 9, 6, 11, 7],\n      [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n      [7, 2, 3, 6, 2, 7],\n      [7, 0, 8, 7, 6, 0, 6, 2, 0],\n      [2, 7, 6, 2, 3, 7, 0, 1, 9],\n      [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6],\n      [10, 7, 6, 10, 1, 7, 1, 3, 7],\n      [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8],\n      [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7],\n      [7, 6, 10, 7, 10, 8, 8, 10, 9],\n      [6, 8, 4, 11, 8, 6],\n      [3, 6, 11, 3, 0, 6, 0, 4, 6],\n      [8, 6, 11, 8, 4, 6, 9, 0, 1],\n      [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6],\n      [6, 8, 4, 6, 11, 8, 2, 10, 1],\n      [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6],\n      [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9],\n      [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n      [8, 2, 3, 8, 4, 2, 4, 6, 2],\n      [0, 4, 2, 4, 6, 2],\n      [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8],\n      [1, 9, 4, 1, 4, 2, 2, 4, 6],\n      [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1],\n      [10, 1, 0, 10, 0, 6, 6, 0, 4],\n      [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3],\n      [10, 9, 4, 6, 10, 4],\n      [4, 9, 5, 7, 6, 11],\n      [0, 8, 3, 4, 9, 5, 11, 7, 6],\n      [5, 0, 1, 5, 4, 0, 7, 6, 11],\n      [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5],\n      [9, 5, 4, 10, 1, 2, 7, 6, 11],\n      [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5],\n      [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2],\n      [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n      [7, 2, 3, 7, 6, 2, 5, 4, 9],\n      [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7],\n      [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0],\n      [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8],\n      [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7],\n      [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4],\n      [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10],\n      [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n      [6, 9, 5, 6, 11, 9, 11, 8, 9],\n      [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5],\n      [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11],\n      [6, 11, 3, 6, 3, 5, 5, 3, 1],\n      [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6],\n      [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10],\n      [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5],\n      [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n      [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2],\n      [9, 5, 6, 9, 6, 0, 0, 6, 2],\n      [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8],\n      [1, 5, 6, 2, 1, 6],\n      [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6],\n      [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0],\n      [0, 3, 8, 5, 6, 10],\n      [10, 5, 6],\n      [11, 5, 10, 7, 5, 11],\n      [11, 5, 10, 11, 7, 5, 8, 3, 0],\n      [5, 11, 7, 5, 10, 11, 1, 9, 0],\n      [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1],\n      [11, 1, 2, 11, 7, 1, 7, 5, 1],\n      [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11],\n      [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7],\n      [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n      [2, 5, 10, 2, 3, 5, 3, 7, 5],\n      [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5],\n      [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2],\n      [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2],\n      [1, 3, 5, 3, 7, 5],\n      [0, 8, 7, 0, 7, 1, 1, 7, 5],\n      [9, 0, 3, 9, 3, 5, 5, 3, 7],\n      [9, 8, 7, 5, 9, 7],\n      [5, 8, 4, 5, 10, 8, 10, 11, 8],\n      [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0],\n      [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5],\n      [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4],\n      [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8],\n      [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11],\n      [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5],\n      [9, 4, 5, 2, 11, 3],\n      [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4],\n      [5, 10, 2, 5, 2, 4, 4, 2, 0],\n      [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9],\n      [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2],\n      [8, 4, 5, 8, 5, 3, 3, 5, 1],\n      [0, 4, 5, 1, 0, 5],\n      [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5],\n      [9, 4, 5],\n      [4, 11, 7, 4, 9, 11, 9, 10, 11],\n      [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11],\n      [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11],\n      [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4],\n      [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2],\n      [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3],\n      [11, 7, 4, 11, 4, 2, 2, 4, 0],\n      [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n      [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9],\n      [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7],\n      [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10],\n      [1, 10, 2, 8, 7, 4],\n      [4, 9, 1, 4, 1, 7, 7, 1, 3],\n      [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1],\n      [4, 0, 3, 7, 4, 3],\n      [4, 8, 7],\n      [9, 10, 8, 10, 11, 8],\n      [3, 0, 9, 3, 9, 11, 11, 9, 10],\n      [0, 1, 10, 0, 10, 8, 8, 10, 11],\n      [3, 1, 10, 11, 3, 10],\n      [1, 2, 11, 1, 11, 9, 9, 11, 8],\n      [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9],\n      [0, 2, 11, 8, 0, 11],\n      [3, 2, 11],\n      [2, 3, 8, 2, 8, 10, 10, 8, 9],\n      [9, 10, 2, 0, 9, 2],\n      [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8],\n      [1, 10, 2],\n      [1, 3, 8, 9, 1, 8],\n      [0, 9, 1],\n      [0, 3, 8],\n      []]\n  , cubeVerts = [\n     [0,0,0]\n    ,[1,0,0]\n    ,[1,1,0]\n    ,[0,1,0]\n    ,[0,0,1]\n    ,[1,0,1]\n    ,[1,1,1]\n    ,[0,1,1]]\n  , edgeIndex = [ [0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7] ];\n\n\n\nexports.marching_cubes = function(args) {\n  var potential = args.potential;\n  var dims      = args.resolution;\n  var bounds    = args.bounds || [[0,0,0], dims];\n  var scale     = [0,0,0];\n  var shift     = [0,0,0];\n  for(var i=0; i<3; ++i) {\n    scale[i] = (bounds[1][i] - bounds[0][i]) / dims[i];\n    shift[i] = bounds[0][i];\n  }\n\n  var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Array(8)\n    , edges = new Array(12)\n    , x = [0,0,0];\n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //For each cell, compute cube mask\n    var cube_index = 0;\n    for(var i=0; i<8; ++i) {\n      var v = cubeVerts[i]\n        , s = potential(\n          scale[0]*(x[0]+v[0])+shift[0],\n          scale[1]*(x[1]+v[1])+shift[1],\n          scale[2]*(x[2]+v[2])+shift[2]);\n      grid[i] = s;\n      cube_index |= (s > 0) ? 1 << i : 0;\n    }\n    //Compute vertices\n    var edge_mask = edgeTable[cube_index];\n    if(edge_mask === 0) {\n      continue;\n    }\n    for(var i=0; i<12; ++i) {\n      if((edge_mask & (1<<i)) === 0) {\n        continue;\n      }\n      edges[i] = vertices.length;\n      var nv = [0,0,0]\n        , e = edgeIndex[i]\n        , p0 = cubeVerts[e[0]]\n        , p1 = cubeVerts[e[1]]\n        , a = grid[e[0]]\n        , b = grid[e[1]]\n        , d = a - b\n        , t = 0;\n      if(Math.abs(d) > 1e-6) {\n        t = a / d;\n      }\n      for(var j=0; j<3; ++j) {\n        nv[j] = scale[j] * ((x[j] + p0[j]) + t * (p1[j] - p0[j])) + shift[j];\n      }\n      vertices.push(nv);\n    }\n    //Add faces\n    var f = triTable[cube_index];\n    for(var i=0; i<f.length; i += 3) {\n      faces.push([edges[f[i]], edges[f[i+1]], edges[f[i+2]]]);\n    }\n  }\n  return { positions: vertices, faces: faces };\n};\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/marchingtetrahedra.js\",function(require,module,exports,__dirname,__filename,process,global){/**\n * Marching Tetrahedra in Javascript\n *\n * Based on Paul Bourke's implementation\n *  http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * (Several bug fixes were made to deal with oriented faces)\n *\n * Javascript port by Mikola Lysenko\n */\nvar cube_vertices = [\n        [0,0,0]\n      , [1,0,0]\n      , [1,1,0]\n      , [0,1,0]\n      , [0,0,1]\n      , [1,0,1]\n      , [1,1,1]\n      , [0,1,1] ]\n  , tetra_list = [\n        [0,2,3,7]\n      , [0,6,2,7]\n      , [0,4,6,7]\n      , [0,6,1,2]\n      , [0,1,6,4]\n      , [5,6,1,4] ];\n\nexports.marching_tetrahedra = function(args) {\n\n  var potential = args.potential;\n  var dims      = args.resolution;\n  var bounds    = args.bounds || [[0,0,0], dims];\n  var scale     = [0,0,0];\n  var shift     = [0,0,0];\n  for(var i=0; i<3; ++i) {\n    scale[i] = (bounds[1][i] - bounds[0][i]) / dims[i];\n    shift[i] = bounds[0][i];\n  }\n   \n   var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = [0,0,0];\n    \n  function interp(i0, i1) {\n    var g0 = grid[i0]\n      , g1 = grid[i1]\n      , p0 = cube_vertices[i0]\n      , p1 = cube_vertices[i1]\n      , v  = [x[0], x[1], x[2]]\n      , t = g0 - g1;\n    if(Math.abs(t) > 1e-6) {\n      t = g0 / t;\n    }\n    for(var i=0; i<3; ++i) {\n      v[i] = scale[i] * (v[i] + p0[i] + t * (p1[i] - p0[i])) + shift[i];\n    }\n    vertices.push(v);\n    return vertices.length - 1;\n  }\n  \n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //Read in cube  \n    for(var i=0; i<8; ++i) {\n      var cube_vert = cube_vertices[i];\n      grid[i] = potential(\n        scale[0]*(x[0]+cube_vert[0])+shift[0],\n        scale[1]*(x[1]+cube_vert[1])+shift[1],\n        scale[2]*(x[2]+cube_vert[2])+shift[2]);\n    }\n    for(var i=0; i<tetra_list.length; ++i) {\n      var T = tetra_list[i]\n        , triindex = 0;\n      if (grid[T[0]] < 0) triindex |= 1;\n      if (grid[T[1]] < 0) triindex |= 2;\n      if (grid[T[2]] < 0) triindex |= 4;\n      if (grid[T[3]] < 0) triindex |= 8;\n      \n      //Handle each case\n      switch (triindex) {\n        case 0x00:\n        case 0x0F:\n        break;\n        case 0x0E:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[3]) \n            , interp(T[0], T[2]) ]);\n        break;\n        case 0x01:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[2])\n            , interp(T[0], T[3])  ]);\n        break;\n        case 0x0D:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[2]) \n            , interp(T[1], T[3]) ]);\n        break;\n        case 0x02:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[3])\n            , interp(T[1], T[2]) ]);\n        break;\n        case 0x0C:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[1], T[3])\n              , interp(T[0], T[3])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x03:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[0], T[2])\n              , interp(T[0], T[3])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x04:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[1])\n              , interp(T[2], T[3]) ]);\n        break;\n        case 0x0B:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[3]) \n              , interp(T[2], T[1]) ]);\n        break;\n        case 0x05:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[1], T[2])\n              , interp(T[2], T[3])\n              , interp(T[0], T[3]) ]);\n        break;\n        case 0x0A:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[0], T[3])\n              , interp(T[2], T[3])\n              , interp(T[1], T[2]) ]);\n        break;\n        case 0x06:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[0], T[2])\n              , interp(T[0], T[1])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x09:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[1], T[3])\n              , interp(T[0], T[1])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x07:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[1])\n              , interp(T[3], T[2]) ]);\n        break;\n        case 0x08:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[2])\n              , interp(T[3], T[1]) ]);\n        break;\n      }\n    }\n  }\n  \n  return { positions: vertices, faces: faces };\n}\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/surfacenets.js\",function(require,module,exports,__dirname,__filename,process,global){/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Array(4096);\n(function() {\n  for(var i=0; i<buffer.length; ++i) {\n    buffer[i] = 0;\n  }\n})();\n\n//Export function\nexports.surface_nets = function(args) {\n\n  var potential = args.potential;\n  var dims      = args.resolution;\n  var bounds    = args.bounds || [[0,0,0], dims];\n  var scale     = [0,0,0];\n  var shift     = [0,0,0];\n  for(var i=0; i<3; ++i) {\n    scale[i] = (bounds[1][i] - bounds[0][i]) / dims[i];\n    shift[i] = bounds[0][i];\n  }\n\n  \n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = [0, 0, 0]\n    , R = [1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)]\n    , grid = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n    , buf_no = 1;\n  \n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    var ol = buffer.length;\n    buffer.length = R[2] * 2;\n    while(ol < buffer.length) {\n      buffer[ol++] = 0;\n    }\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0;\n      for(var k=0; k<2; ++k)\n      for(var j=0; j<2; ++j)      \n      for(var i=0; i<2; ++i, ++g) {\n        var p = potential(\n          scale[0]*(x[0]+i)+shift[0],\n          scale[1]*(x[1]+j)+shift[1],\n          scale[2]*(x[2]+k)+shift[2]);\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = scale[i] * (x[i] + s * v[i]) + shift[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m],    buffer[m-du],    buffer[m-dv]]);\n          faces.push([buffer[m-dv], buffer[m-du],    buffer[m-du-dv]]);\n        } else {\n          faces.push([buffer[m],    buffer[m-dv],    buffer[m-du]]);\n          faces.push([buffer[m-du], buffer[m-dv],    buffer[m-du-dv]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { positions: vertices, faces: faces };\n};\n\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/normals.js\",function(require,module,exports,__dirname,__filename,process,global){var EPSILON = 1e-6;\n\n//Estimate the vertex normals of a mesh\nexports.vertex_normals = function(args) {\n  \n  var positions = args.positions;\n  var faces     = args.faces;\n  var N         = positions.length;\n  var normals   = new Array(N);\n  \n  //Initialize normal array\n  for(var i=0; i<N; ++i) {\n    normals[i] = [0.0, 0.0, 0.0];\n  }\n  \n  //Walk over all the faces and add per-vertex contribution to normal weights\n  for(var i=0; i<faces.length; ++i) {\n    var f = faces[i];\n    var p = 0;\n    var c = f[f.length-1];\n    var n = f[0];\n    for(var j=0; j<f.length; ++j) {\n    \n      //Shift indices back\n      p = c;\n      c = n;\n      n = f[(j+1) % f.length];\n    \n      var v0 = positions[p];\n      var v1 = positions[c];\n      var v2 = positions[n];\n      \n      //Compute arc lengths\n      var d01 = new Array(3);\n      var m01 = 0.0;\n      var d21 = new Array(3);\n      var m21 = 0.0;\n      for(var k=0; k<3; ++k) {\n        d01[k] = v0[k]  - v1[k];\n        m01   += d01[k] * d01[k];\n        d21[k] = v2[k]  - v1[k];\n        m21   += d21[k] * d21[k];\n      }\n\n      //Accumulate values in normal\n      if(m01 * m21 > EPSILON) {\n        var norm = normals[c];\n        var w = 1.0 / Math.sqrt(m01 * m21);\n        for(var k=0; k<3; ++k) {\n          var u = (k+1)%3;\n          var v = (k+2)%3;\n          norm[k] += w * (d21[u] * d01[v] - d21[v] * d01[u]);\n        }\n      }\n    }\n  }\n  \n  //Scale all normals to unit length\n  for(var i=0; i<N; ++i) {\n    var norm = normals[i];\n    var m = 0.0;\n    for(var k=0; k<3; ++k) {\n      m += norm[k] * norm[k];\n    }\n    if(m > EPSILON) {\n      var w = 1.0 / Math.sqrt(m);\n      for(var k=0; k<3; ++k) {\n        norm[k] *= w;\n      }\n    } else {\n      for(var k=0; k<3; ++k) {\n        norm[k] = 0.0;\n      }\n    }\n  }\n\n  //Return the resulting set of patches\n  return normals;\n}\n\n//Compute face normals of a mesh\nexports.face_normals = function(args) {\n  var positions = args.positions;\n  var faces     = args.faces;\n  var N         = faces.length;\n  var normals   = new Array(N);\n  \n  for(var i=0; i<N; ++i) {\n    var f = faces[i];\n    var pos = new Array(3);\n    for(var j=0; j<3; ++j) {\n      pos[j] = positions[f[j]];\n    }\n    \n    var d01 = new Array(3);\n    var d21 = new Array(3);\n    for(var j=0; j<3; ++j) {\n      d01[j] = pos[1][j] - pos[0][j];\n      d21[j] = pos[2][j] - pos[0][j];\n    }\n    \n    var n = new Array(3);\n    var l = 0.0;\n    for(var j=0; j<3; ++j) {\n      var u = (j+1)%3;\n      var v = (j+2)%3;\n      n[j] = d01[u] * d21[v] - d01[v] * d21[u];\n      l += n[j] * n[j];\n    }\n    if(l > EPSILON) {\n      l = 1.0 / Math.sqrt(l);\n    } else {\n      l = 0.0;\n    }\n    for(var j=0; j<3; ++j) {\n      n[j] *= l;\n    }\n    normals[i] = n;\n  }\n  return normals;\n}\n\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/distance.js\",function(require,module,exports,__dirname,__filename,process,global){var assert = require('assert');\nvar BinaryHeap = require('./heap.js').BinaryHeap;\nvar vertex_stars = require('./topology.js').vertex_stars;\n\nvar EPSILON   = 1e-6;\n\n//Computes quadratic distance to point c\nfunction quadratic_distance(a, b, c, dpa, dpb, orientation) {\n  \n  var ab = new Array(3);\n  var ac = new Array(3);\n  var dab2 = 0.0;\n  for(var i=0; i<3; ++i) {\n    ab[i] = b[i] - a[i];\n    dab2 += ab[i] * ab[i];\n    ac[i] = c[i] - a[i];\n  }\n  if(dab2 < EPSILON) {\n    return 1e30;\n  }\n  \n  //Transform c into triangle coordinate system\n  var dab = Math.sqrt(dab2);\n  var s = 1.0 / dab;\n  var c0 = 0.0;\n  for(var i=0; i<3; ++i) {\n    ab[i] *= s;\n    c0 += ab[i] * ac[i];\n  }\n  var c1 = 0.0;  \n  for(var i=0; i<3; ++i) {\n    c1 += Math.pow(ac[i] - c0 * ab[i], 2);\n  }\n  c1 = Math.sqrt(c1);\n  \n  //Compute center of distance field\n  var dpa2 = dpa*dpa;\n  var dpb2 = dpb*dpb;\n  var p0 = (dpa2 - dpb2 + dab2) / (2.0 * dab);\n  var p1 = dpa2 - p0*p0;\n  if(p1 < 0.0) {\n    return 1e30;\n  }\n  p1 = Math.sqrt(p1);\n  if(orientation < 0) {\n    p1 *= -1;\n  }\n  \n  //Compute new distance bound\n  var d = Math.sqrt(Math.pow(c0 - p0, 2) + Math.pow(c1 - p1, 2));\n  \n  //Return min\n  return d;\n  \n}\n\nfunction Pair(d,v) {\n  this.d = d;\n  this.v = v;\n}\n\n\nfunction dijkstra(p, stars, faces, positions, max_distance) {\n  var to_visit  = new BinaryHeap(new Function(\"a\", \"return a.d;\"));\n  var distances = {};\n  to_visit.push(new Pair(0, p));\n  \n  var center = positions[p];\n  var msquared = max_distance * max_distance;\n  \n  while(to_visit.size() > 0) {\n    var node = to_visit.pop();\n    if(node.v in distances) {\n      continue;\n    }\n    \n    var d = node.d;\n    var v = node.v;\n    distances[v] = d;\n    \n    var a     = positions[v];\n    var nbhd  = stars[v];\n    \n    for(var i=0; i<nbhd.length; ++i) {\n      var f = faces[nbhd[i]];\n      for(var j=0; j<f.length; ++j) {\n        var u = f[j];\n        if((u === v) || (u in distances)) {\n          continue;\n        }\n        var b = positions[u];\n        \n        var dist = 0.0, ldist = 0.0;\n        for(var k=0; k<3; ++k) {\n          dist += Math.pow(a[k] - b[k], 2);\n          ldist += Math.pow(center[k] - b[k], 2)\n        }\n        \n        //NOTE: This is not quite correct, since we only have an upper bound on dist, not a lower bound...\n        if(ldist <= msquared) {\n          to_visit.push(new Pair(Math.sqrt(dist) + d,u));\n        }\n      }\n    }\n  }\n  return distances;\n}\n\nfunction refine_distances(p, distances, positions, stars, faces, max_distance, tolerance) {\n  //Unpack distances into an array for easier processing\n  function compare_func(a, b) {\n    return distances[a] - distances[b];\n  }\n  \n  //Next, we do several passes to refine the initial bound on the distance until we get something that approaches the true distance to p\n  var stabilized = false;\n  while(!stabilized) {\n    stabilized = true;\n\n    //First, sort vertices by distance\n    var vertices = [];\n    for(var v in distances) {\n      vertices.push(v);\n    }\n    vertices.sort(compare_func);\n    \n      //Next, walk over vertices in order of distance\n      for(var mm=0; mm<vertices.length; ++mm) {\n      var v     = vertices[mm];\n      if(distances[v] > max_distance) {\n        break;\n      }\n      \n      //Iterate over all faces incident to v\n      var nbhd  = stars[v];\n      \n      for(var nn=0; nn<nbhd.length; ++nn) {\n      \n        //Make a copy of the face\n        var face = faces[nbhd[nn]].slice(0);\n        face.sort(compare_func);\n        \n        if(Math.abs(distances[face[1]] - distances[face[2]]) < 1e-6) {\n          continue;\n        }\n        \n        //Compute new distance estimate for farthest point\n        var n_distance = quadratic_distance(\n            positions[face[0]],\n            positions[face[1]],\n            positions[face[2]],\n            distances[face[0]],\n            distances[face[1]],\n            -1);\n        if(n_distance > max_distance) {\n          continue;\n        }\n        \n        var o_distance = distances[face[2]];\n        \n        //Update distance\n        if(n_distance < o_distance && Math.abs(n_distance - o_distance) > tolerance) {\n          distances[face[2]] = Math.min(o_distance, n_distance);\n          stabilized = false;\n        }\n      }\n    }\n  }\n}\n\n\n//Computes a distances to a vertex p\nfunction geodesic_distance(args) {\n\n  var positions   = args.positions;\n  var faces       = args.faces;\n  var p           = args.initial_vertex;\n  var stars       = args.stars \n                  || vertex_stars({ vertex_count: positions.length, faces: faces });\n  var max_distance = args.max_distance \n                  || Number.POSITIVE_INFINITY;\n  var tolerance   = args.tolerance || 1e-4;\n\n  //First, run Dijkstra's algorithm to get an initial bound on the distance from each vertex\n  // to the base point just using edge lengths\n  var distances = dijkstra(p, stars, faces, positions, max_distance);\n  \n  //Then refine distances to acceptable threshold\n  refine_distances(p, distances, positions, stars, faces, max_distance, tolerance);\n  \n  return distances;\n}\n\nexports.quadratic_distance = quadratic_distance;\nexports.geodesic_distance = geodesic_distance;\n\n});\n\nrequire.define(\"assert\",function(require,module,exports,__dirname,__filename,process,global){// UTILITY\nvar util = require('util');\nvar Buffer = require(\"buffer\").Buffer;\nvar pSlice = Array.prototype.slice;\n\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.message = options.message;\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  var stackStartFunction = options.stackStartFunction || fail;\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  }\n};\nutil.inherits(assert.AssertionError, Error);\n\nfunction replacer(key, value) {\n  if (value === undefined) {\n    return '' + value;\n  }\n  if (typeof value === 'number' && (isNaN(value) || !isFinite(value))) {\n    return value.toString();\n  }\n  if (typeof value === 'function' || value instanceof RegExp) {\n    return value.toString();\n  }\n  return value;\n}\n\nfunction truncate(s, n) {\n  if (typeof s == 'string') {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\n\nassert.AssertionError.prototype.toString = function() {\n  if (this.message) {\n    return [this.name + ':', this.message].join(' ');\n  } else {\n    return [\n      this.name + ':',\n      truncate(JSON.stringify(this.actual, replacer), 128),\n      this.operator,\n      truncate(JSON.stringify(this.expected, replacer), 128)\n    ].join(' ');\n  }\n};\n\n// assert.AssertionError instanceof Error\n\nassert.AssertionError.__proto__ = Error.prototype;\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n  if (!!!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected) {\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n\n  } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {\n    if (actual.length != expected.length) return false;\n\n    for (var i = 0; i < actual.length; i++) {\n      if (actual[i] !== expected[i]) return false;\n    }\n\n    return true;\n\n  // 7.2. If the expected value is a Date object, the actual value is\n  // equivalent if it is also a Date object that refers to the same time.\n  } else if (actual instanceof Date && expected instanceof Date) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if (typeof actual != 'object' && typeof expected != 'object') {\n    return actual == expected;\n\n  // 7.4. For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else {\n    return objEquiv(actual, expected);\n  }\n}\n\nfunction isUndefinedOrNull(value) {\n  return value === null || value === undefined;\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b) {\n  if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n    return false;\n  // an identical 'prototype' property.\n  if (a.prototype !== b.prototype) return false;\n  //~~~I've managed to break Object.keys through screwy arguments passing.\n  //   Converting to array solves the problem.\n  if (isArguments(a)) {\n    if (!isArguments(b)) {\n      return false;\n    }\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b);\n  }\n  try {\n    var ka = Object.keys(a),\n        kb = Object.keys(b),\n        key, i;\n  } catch (e) {//happens when one is a string literal and the other isn't\n    return false;\n  }\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length != kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key])) return false;\n  }\n  return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (expected instanceof RegExp) {\n    return expected.test(actual);\n  } else if (actual instanceof expected) {\n    return true;\n  } else if (expected.call({}, actual) === true) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (typeof expected === 'string') {\n    message = expected;\n    expected = null;\n  }\n\n  try {\n    block();\n  } catch (e) {\n    actual = e;\n  }\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail('Missing expected exception' + message);\n  }\n\n  if (!shouldThrow && expectedException(actual, expected)) {\n    fail('Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws.apply(this, [true].concat(pSlice.call(arguments)));\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {\n  _throws.apply(this, [false].concat(pSlice.call(arguments)));\n};\n\nassert.ifError = function(err) { if (err) {throw err;}};\n\n});\n\nrequire.define(\"util\",function(require,module,exports,__dirname,__filename,process,global){var events = require('events');\n\nexports.print = function () {};\nexports.puts = function () {};\nexports.debug = function() {};\n\nexports.inspect = function(obj, showHidden, depth, colors) {\n  var seen = [];\n\n  var stylize = function(str, styleType) {\n    // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n    var styles =\n        { 'bold' : [1, 22],\n          'italic' : [3, 23],\n          'underline' : [4, 24],\n          'inverse' : [7, 27],\n          'white' : [37, 39],\n          'grey' : [90, 39],\n          'black' : [30, 39],\n          'blue' : [34, 39],\n          'cyan' : [36, 39],\n          'green' : [32, 39],\n          'magenta' : [35, 39],\n          'red' : [31, 39],\n          'yellow' : [33, 39] };\n\n    var style =\n        { 'special': 'cyan',\n          'number': 'blue',\n          'boolean': 'yellow',\n          'undefined': 'grey',\n          'null': 'bold',\n          'string': 'green',\n          'date': 'magenta',\n          // \"name\": intentionally not styling\n          'regexp': 'red' }[styleType];\n\n    if (style) {\n      return '\\033[' + styles[style][0] + 'm' + str +\n             '\\033[' + styles[style][1] + 'm';\n    } else {\n      return str;\n    }\n  };\n  if (! colors) {\n    stylize = function(str, styleType) { return str; };\n  }\n\n  function format(value, recurseTimes) {\n    // Provide a hook for user-specified inspect functions.\n    // Check that value is an object with an inspect function on it\n    if (value && typeof value.inspect === 'function' &&\n        // Filter out the util module, it's inspect function is special\n        value !== exports &&\n        // Also filter out any prototype objects using the circular check.\n        !(value.constructor && value.constructor.prototype === value)) {\n      return value.inspect(recurseTimes);\n    }\n\n    // Primitive types cannot have properties\n    switch (typeof value) {\n      case 'undefined':\n        return stylize('undefined', 'undefined');\n\n      case 'string':\n        var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                                 .replace(/'/g, \"\\\\'\")\n                                                 .replace(/\\\\\"/g, '\"') + '\\'';\n        return stylize(simple, 'string');\n\n      case 'number':\n        return stylize('' + value, 'number');\n\n      case 'boolean':\n        return stylize('' + value, 'boolean');\n    }\n    // For some reason typeof null is \"object\", so special case here.\n    if (value === null) {\n      return stylize('null', 'null');\n    }\n\n    // Look up the keys of the object.\n    var visible_keys = Object_keys(value);\n    var keys = showHidden ? Object_getOwnPropertyNames(value) : visible_keys;\n\n    // Functions without properties can be shortcutted.\n    if (typeof value === 'function' && keys.length === 0) {\n      if (isRegExp(value)) {\n        return stylize('' + value, 'regexp');\n      } else {\n        var name = value.name ? ': ' + value.name : '';\n        return stylize('[Function' + name + ']', 'special');\n      }\n    }\n\n    // Dates without properties can be shortcutted\n    if (isDate(value) && keys.length === 0) {\n      return stylize(value.toUTCString(), 'date');\n    }\n\n    var base, type, braces;\n    // Determine the object type\n    if (isArray(value)) {\n      type = 'Array';\n      braces = ['[', ']'];\n    } else {\n      type = 'Object';\n      braces = ['{', '}'];\n    }\n\n    // Make functions say that they are functions\n    if (typeof value === 'function') {\n      var n = value.name ? ': ' + value.name : '';\n      base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']';\n    } else {\n      base = '';\n    }\n\n    // Make dates with properties first say the date\n    if (isDate(value)) {\n      base = ' ' + value.toUTCString();\n    }\n\n    if (keys.length === 0) {\n      return braces[0] + base + braces[1];\n    }\n\n    if (recurseTimes < 0) {\n      if (isRegExp(value)) {\n        return stylize('' + value, 'regexp');\n      } else {\n        return stylize('[Object]', 'special');\n      }\n    }\n\n    seen.push(value);\n\n    var output = keys.map(function(key) {\n      var name, str;\n      if (value.__lookupGetter__) {\n        if (value.__lookupGetter__(key)) {\n          if (value.__lookupSetter__(key)) {\n            str = stylize('[Getter/Setter]', 'special');\n          } else {\n            str = stylize('[Getter]', 'special');\n          }\n        } else {\n          if (value.__lookupSetter__(key)) {\n            str = stylize('[Setter]', 'special');\n          }\n        }\n      }\n      if (visible_keys.indexOf(key) < 0) {\n        name = '[' + key + ']';\n      }\n      if (!str) {\n        if (seen.indexOf(value[key]) < 0) {\n          if (recurseTimes === null) {\n            str = format(value[key]);\n          } else {\n            str = format(value[key], recurseTimes - 1);\n          }\n          if (str.indexOf('\\n') > -1) {\n            if (isArray(value)) {\n              str = str.split('\\n').map(function(line) {\n                return '  ' + line;\n              }).join('\\n').substr(2);\n            } else {\n              str = '\\n' + str.split('\\n').map(function(line) {\n                return '   ' + line;\n              }).join('\\n');\n            }\n          }\n        } else {\n          str = stylize('[Circular]', 'special');\n        }\n      }\n      if (typeof name === 'undefined') {\n        if (type === 'Array' && key.match(/^\\d+$/)) {\n          return str;\n        }\n        name = JSON.stringify('' + key);\n        if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n          name = name.substr(1, name.length - 2);\n          name = stylize(name, 'name');\n        } else {\n          name = name.replace(/'/g, \"\\\\'\")\n                     .replace(/\\\\\"/g, '\"')\n                     .replace(/(^\"|\"$)/g, \"'\");\n          name = stylize(name, 'string');\n        }\n      }\n\n      return name + ': ' + str;\n    });\n\n    seen.pop();\n\n    var numLinesEst = 0;\n    var length = output.reduce(function(prev, cur) {\n      numLinesEst++;\n      if (cur.indexOf('\\n') >= 0) numLinesEst++;\n      return prev + cur.length + 1;\n    }, 0);\n\n    if (length > 50) {\n      output = braces[0] +\n               (base === '' ? '' : base + '\\n ') +\n               ' ' +\n               output.join(',\\n  ') +\n               ' ' +\n               braces[1];\n\n    } else {\n      output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n    }\n\n    return output;\n  }\n  return format(obj, (typeof depth === 'undefined' ? 2 : depth));\n};\n\n\nfunction isArray(ar) {\n  return ar instanceof Array ||\n         Array.isArray(ar) ||\n         (ar && ar !== Object.prototype && isArray(ar.__proto__));\n}\n\n\nfunction isRegExp(re) {\n  return re instanceof RegExp ||\n    (typeof re === 'object' && Object.prototype.toString.call(re) === '[object RegExp]');\n}\n\n\nfunction isDate(d) {\n  if (d instanceof Date) return true;\n  if (typeof d !== 'object') return false;\n  var properties = Date.prototype && Object_getOwnPropertyNames(Date.prototype);\n  var proto = d.__proto__ && Object_getOwnPropertyNames(d.__proto__);\n  return JSON.stringify(proto) === JSON.stringify(properties);\n}\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\nexports.log = function (msg) {};\n\nexports.pump = null;\n\nvar Object_keys = Object.keys || function (obj) {\n    var res = [];\n    for (var key in obj) res.push(key);\n    return res;\n};\n\nvar Object_getOwnPropertyNames = Object.getOwnPropertyNames || function (obj) {\n    var res = [];\n    for (var key in obj) {\n        if (Object.hasOwnProperty.call(obj, key)) res.push(key);\n    }\n    return res;\n};\n\nvar Object_create = Object.create || function (prototype, properties) {\n    // from es5-shim\n    var object;\n    if (prototype === null) {\n        object = { '__proto__' : null };\n    }\n    else {\n        if (typeof prototype !== 'object') {\n            throw new TypeError(\n                'typeof prototype[' + (typeof prototype) + '] != \\'object\\''\n            );\n        }\n        var Type = function () {};\n        Type.prototype = prototype;\n        object = new Type();\n        object.__proto__ = prototype;\n    }\n    if (typeof properties !== 'undefined' && Object.defineProperties) {\n        Object.defineProperties(object, properties);\n    }\n    return object;\n};\n\nexports.inherits = function(ctor, superCtor) {\n  ctor.super_ = superCtor;\n  ctor.prototype = Object_create(superCtor.prototype, {\n    constructor: {\n      value: ctor,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n};\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (typeof f !== 'string') {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(exports.inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j': return JSON.stringify(args[i++]);\n      default:\n        return x;\n    }\n  });\n  for(var x = args[i]; i < len; x = args[++i]){\n    if (x === null || typeof x !== 'object') {\n      str += ' ' + x;\n    } else {\n      str += ' ' + exports.inspect(x);\n    }\n  }\n  return str;\n};\n\n});\n\nrequire.define(\"events\",function(require,module,exports,__dirname,__filename,process,global){if (!process.EventEmitter) process.EventEmitter = function () {};\n\nvar EventEmitter = exports.EventEmitter = process.EventEmitter;\nvar isArray = typeof Array.isArray === 'function'\n    ? Array.isArray\n    : function (xs) {\n        return Object.prototype.toString.call(xs) === '[object Array]'\n    }\n;\nfunction indexOf (xs, x) {\n    if (xs.indexOf) return xs.indexOf(x);\n    for (var i = 0; i < xs.length; i++) {\n        if (x === xs[i]) return i;\n    }\n    return -1;\n}\n\n// By default EventEmitters will print a warning if more than\n// 10 listeners are added to it. This is a useful default which\n// helps finding memory leaks.\n//\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nvar defaultMaxListeners = 10;\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!this._events) this._events = {};\n  this._events.maxListeners = n;\n};\n\n\nEventEmitter.prototype.emit = function(type) {\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events || !this._events.error ||\n        (isArray(this._events.error) && !this._events.error.length))\n    {\n      if (arguments[1] instanceof Error) {\n        throw arguments[1]; // Unhandled 'error' event\n      } else {\n        throw new Error(\"Uncaught, unspecified 'error' event.\");\n      }\n      return false;\n    }\n  }\n\n  if (!this._events) return false;\n  var handler = this._events[type];\n  if (!handler) return false;\n\n  if (typeof handler == 'function') {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        var args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n    return true;\n\n  } else if (isArray(handler)) {\n    var args = Array.prototype.slice.call(arguments, 1);\n\n    var listeners = handler.slice();\n    for (var i = 0, l = listeners.length; i < l; i++) {\n      listeners[i].apply(this, args);\n    }\n    return true;\n\n  } else {\n    return false;\n  }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n  if ('function' !== typeof listener) {\n    throw new Error('addListener only takes instances of Function');\n  }\n\n  if (!this._events) this._events = {};\n\n  // To avoid recursion in the case that type == \"newListeners\"! Before\n  // adding it to the listeners, first emit \"newListeners\".\n  this.emit('newListener', type, listener);\n\n  if (!this._events[type]) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  } else if (isArray(this._events[type])) {\n\n    // Check for listener leak\n    if (!this._events[type].warned) {\n      var m;\n      if (this._events.maxListeners !== undefined) {\n        m = this._events.maxListeners;\n      } else {\n        m = defaultMaxListeners;\n      }\n\n      if (m && m > 0 && this._events[type].length > m) {\n        this._events[type].warned = true;\n        console.error('(node) warning: possible EventEmitter memory ' +\n                      'leak detected. %d listeners added. ' +\n                      'Use emitter.setMaxListeners() to increase limit.',\n                      this._events[type].length);\n        console.trace();\n      }\n    }\n\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  } else {\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  var self = this;\n  self.on(type, function g() {\n    self.removeListener(type, g);\n    listener.apply(this, arguments);\n  });\n\n  return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n  if ('function' !== typeof listener) {\n    throw new Error('removeListener only takes instances of Function');\n  }\n\n  // does not use listeners(), so no side effect of creating _events[type]\n  if (!this._events || !this._events[type]) return this;\n\n  var list = this._events[type];\n\n  if (isArray(list)) {\n    var i = indexOf(list, listener);\n    if (i < 0) return this;\n    list.splice(i, 1);\n    if (list.length == 0)\n      delete this._events[type];\n  } else if (this._events[type] === listener) {\n    delete this._events[type];\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  // does not use listeners(), so no side effect of creating _events[type]\n  if (type && this._events && this._events[type]) this._events[type] = null;\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  if (!this._events) this._events = {};\n  if (!this._events[type]) this._events[type] = [];\n  if (!isArray(this._events[type])) {\n    this._events[type] = [this._events[type]];\n  }\n  return this._events[type];\n};\n\n});\n\nrequire.define(\"buffer\",function(require,module,exports,__dirname,__filename,process,global){module.exports = require(\"buffer-browserify\")\n});\n\nrequire.define(\"/node_modules/buffer-browserify/package.json\",function(require,module,exports,__dirname,__filename,process,global){module.exports = {\"main\":\"index.js\",\"browserify\":\"index.js\"}\n});\n\nrequire.define(\"/node_modules/buffer-browserify/index.js\",function(require,module,exports,__dirname,__filename,process,global){function SlowBuffer (size) {\n    this.length = size;\n};\n\nvar assert = require('assert');\n\nexports.INSPECT_MAX_BYTES = 50;\n\n\nfunction toHex(n) {\n  if (n < 16) return '0' + n.toString(16);\n  return n.toString(16);\n}\n\nfunction utf8ToBytes(str) {\n  var byteArray = [];\n  for (var i = 0; i < str.length; i++)\n    if (str.charCodeAt(i) <= 0x7F)\n      byteArray.push(str.charCodeAt(i));\n    else {\n      var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');\n      for (var j = 0; j < h.length; j++)\n        byteArray.push(parseInt(h[j], 16));\n    }\n\n  return byteArray;\n}\n\nfunction asciiToBytes(str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++ )\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push( str.charCodeAt(i) & 0xFF );\n\n  return byteArray;\n}\n\nfunction base64ToBytes(str) {\n  return require(\"base64-js\").toByteArray(str);\n}\n\nSlowBuffer.byteLength = function (str, encoding) {\n  switch (encoding || \"utf8\") {\n    case 'hex':\n      return str.length / 2;\n\n    case 'utf8':\n    case 'utf-8':\n      return utf8ToBytes(str).length;\n\n    case 'ascii':\n      return str.length;\n\n    case 'base64':\n      return base64ToBytes(str).length;\n\n    default:\n      throw new Error('Unknown encoding');\n  }\n};\n\nfunction blitBuffer(src, dst, offset, length) {\n  var pos, i = 0;\n  while (i < length) {\n    if ((i+offset >= dst.length) || (i >= src.length))\n      break;\n\n    dst[i + offset] = src[i];\n    i++;\n  }\n  return i;\n}\n\nSlowBuffer.prototype.utf8Write = function (string, offset, length) {\n  var bytes, pos;\n  return SlowBuffer._charsWritten =  blitBuffer(utf8ToBytes(string), this, offset, length);\n};\n\nSlowBuffer.prototype.asciiWrite = function (string, offset, length) {\n  var bytes, pos;\n  return SlowBuffer._charsWritten =  blitBuffer(asciiToBytes(string), this, offset, length);\n};\n\nSlowBuffer.prototype.base64Write = function (string, offset, length) {\n  var bytes, pos;\n  return SlowBuffer._charsWritten = blitBuffer(base64ToBytes(string), this, offset, length);\n};\n\nSlowBuffer.prototype.base64Slice = function (start, end) {\n  var bytes = Array.prototype.slice.apply(this, arguments)\n  return require(\"base64-js\").fromByteArray(bytes);\n}\n\nfunction decodeUtf8Char(str) {\n  try {\n    return decodeURIComponent(str);\n  } catch (err) {\n    return String.fromCharCode(0xFFFD); // UTF 8 invalid char\n  }\n}\n\nSlowBuffer.prototype.utf8Slice = function () {\n  var bytes = Array.prototype.slice.apply(this, arguments);\n  var res = \"\";\n  var tmp = \"\";\n  var i = 0;\n  while (i < bytes.length) {\n    if (bytes[i] <= 0x7F) {\n      res += decodeUtf8Char(tmp) + String.fromCharCode(bytes[i]);\n      tmp = \"\";\n    } else\n      tmp += \"%\" + bytes[i].toString(16);\n\n    i++;\n  }\n\n  return res + decodeUtf8Char(tmp);\n}\n\nSlowBuffer.prototype.asciiSlice = function () {\n  var bytes = Array.prototype.slice.apply(this, arguments);\n  var ret = \"\";\n  for (var i = 0; i < bytes.length; i++)\n    ret += String.fromCharCode(bytes[i]);\n  return ret;\n}\n\nSlowBuffer.prototype.inspect = function() {\n  var out = [],\n      len = this.length;\n  for (var i = 0; i < len; i++) {\n    out[i] = toHex(this[i]);\n    if (i == exports.INSPECT_MAX_BYTES) {\n      out[i + 1] = '...';\n      break;\n    }\n  }\n  return '<SlowBuffer ' + out.join(' ') + '>';\n};\n\n\nSlowBuffer.prototype.hexSlice = function(start, end) {\n  var len = this.length;\n\n  if (!start || start < 0) start = 0;\n  if (!end || end < 0 || end > len) end = len;\n\n  var out = '';\n  for (var i = start; i < end; i++) {\n    out += toHex(this[i]);\n  }\n  return out;\n};\n\n\nSlowBuffer.prototype.toString = function(encoding, start, end) {\n  encoding = String(encoding || 'utf8').toLowerCase();\n  start = +start || 0;\n  if (typeof end == 'undefined') end = this.length;\n\n  // Fastpath empty strings\n  if (+end == start) {\n    return '';\n  }\n\n  switch (encoding) {\n    case 'hex':\n      return this.hexSlice(start, end);\n\n    case 'utf8':\n    case 'utf-8':\n      return this.utf8Slice(start, end);\n\n    case 'ascii':\n      return this.asciiSlice(start, end);\n\n    case 'binary':\n      return this.binarySlice(start, end);\n\n    case 'base64':\n      return this.base64Slice(start, end);\n\n    case 'ucs2':\n    case 'ucs-2':\n      return this.ucs2Slice(start, end);\n\n    default:\n      throw new Error('Unknown encoding');\n  }\n};\n\n\nSlowBuffer.prototype.hexWrite = function(string, offset, length) {\n  offset = +offset || 0;\n  var remaining = this.length - offset;\n  if (!length) {\n    length = remaining;\n  } else {\n    length = +length;\n    if (length > remaining) {\n      length = remaining;\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length;\n  if (strLen % 2) {\n    throw new Error('Invalid hex string');\n  }\n  if (length > strLen / 2) {\n    length = strLen / 2;\n  }\n  for (var i = 0; i < length; i++) {\n    var byte = parseInt(string.substr(i * 2, 2), 16);\n    if (isNaN(byte)) throw new Error('Invalid hex string');\n    this[offset + i] = byte;\n  }\n  SlowBuffer._charsWritten = i * 2;\n  return i;\n};\n\n\nSlowBuffer.prototype.write = function(string, offset, length, encoding) {\n  // Support both (string, offset, length, encoding)\n  // and the legacy (string, encoding, offset, length)\n  if (isFinite(offset)) {\n    if (!isFinite(length)) {\n      encoding = length;\n      length = undefined;\n    }\n  } else {  // legacy\n    var swap = encoding;\n    encoding = offset;\n    offset = length;\n    length = swap;\n  }\n\n  offset = +offset || 0;\n  var remaining = this.length - offset;\n  if (!length) {\n    length = remaining;\n  } else {\n    length = +length;\n    if (length > remaining) {\n      length = remaining;\n    }\n  }\n  encoding = String(encoding || 'utf8').toLowerCase();\n\n  switch (encoding) {\n    case 'hex':\n      return this.hexWrite(string, offset, length);\n\n    case 'utf8':\n    case 'utf-8':\n      return this.utf8Write(string, offset, length);\n\n    case 'ascii':\n      return this.asciiWrite(string, offset, length);\n\n    case 'binary':\n      return this.binaryWrite(string, offset, length);\n\n    case 'base64':\n      return this.base64Write(string, offset, length);\n\n    case 'ucs2':\n    case 'ucs-2':\n      return this.ucs2Write(string, offset, length);\n\n    default:\n      throw new Error('Unknown encoding');\n  }\n};\n\n\n// slice(start, end)\nSlowBuffer.prototype.slice = function(start, end) {\n  if (end === undefined) end = this.length;\n\n  if (end > this.length) {\n    throw new Error('oob');\n  }\n  if (start > end) {\n    throw new Error('oob');\n  }\n\n  return new Buffer(this, end - start, +start);\n};\n\nSlowBuffer.prototype.copy = function(target, targetstart, sourcestart, sourceend) {\n  var temp = [];\n  for (var i=sourcestart; i<sourceend; i++) {\n    assert.ok(typeof this[i] !== 'undefined', \"copying undefined buffer bytes!\");\n    temp.push(this[i]);\n  }\n\n  for (var i=targetstart; i<targetstart+temp.length; i++) {\n    target[i] = temp[i-targetstart];\n  }\n};\n\nfunction coerce(length) {\n  // Coerce length to a number (possibly NaN), round up\n  // in case it's fractional (e.g. 123.456) then do a\n  // double negate to coerce a NaN to 0. Easy, right?\n  length = ~~Math.ceil(+length);\n  return length < 0 ? 0 : length;\n}\n\n\n// Buffer\n\nfunction Buffer(subject, encoding, offset) {\n  if (!(this instanceof Buffer)) {\n    return new Buffer(subject, encoding, offset);\n  }\n\n  var type;\n\n  // Are we slicing?\n  if (typeof offset === 'number') {\n    this.length = coerce(encoding);\n    this.parent = subject;\n    this.offset = offset;\n  } else {\n    // Find the length\n    switch (type = typeof subject) {\n      case 'number':\n        this.length = coerce(subject);\n        break;\n\n      case 'string':\n        this.length = Buffer.byteLength(subject, encoding);\n        break;\n\n      case 'object': // Assume object is an array\n        this.length = coerce(subject.length);\n        break;\n\n      default:\n        throw new Error('First argument needs to be a number, ' +\n                        'array or string.');\n    }\n\n    if (this.length > Buffer.poolSize) {\n      // Big buffer, just alloc one.\n      this.parent = new SlowBuffer(this.length);\n      this.offset = 0;\n\n    } else {\n      // Small buffer.\n      if (!pool || pool.length - pool.used < this.length) allocPool();\n      this.parent = pool;\n      this.offset = pool.used;\n      pool.used += this.length;\n    }\n\n    // Treat array-ish objects as a byte array.\n    if (isArrayIsh(subject)) {\n      for (var i = 0; i < this.length; i++) {\n        this.parent[i + this.offset] = subject[i];\n      }\n    } else if (type == 'string') {\n      // We are a string\n      this.length = this.write(subject, 0, encoding);\n    }\n  }\n\n}\n\nfunction isArrayIsh(subject) {\n  return Array.isArray(subject) || Buffer.isBuffer(subject) ||\n         subject && typeof subject === 'object' &&\n         typeof subject.length === 'number';\n}\n\nexports.SlowBuffer = SlowBuffer;\nexports.Buffer = Buffer;\n\nBuffer.poolSize = 8 * 1024;\nvar pool;\n\nfunction allocPool() {\n  pool = new SlowBuffer(Buffer.poolSize);\n  pool.used = 0;\n}\n\n\n// Static methods\nBuffer.isBuffer = function isBuffer(b) {\n  return b instanceof Buffer || b instanceof SlowBuffer;\n};\n\nBuffer.concat = function (list, totalLength) {\n  if (!Array.isArray(list)) {\n    throw new Error(\"Usage: Buffer.concat(list, [totalLength])\\n \\\n      list should be an Array.\");\n  }\n\n  if (list.length === 0) {\n    return new Buffer(0);\n  } else if (list.length === 1) {\n    return list[0];\n  }\n\n  if (typeof totalLength !== 'number') {\n    totalLength = 0;\n    for (var i = 0; i < list.length; i++) {\n      var buf = list[i];\n      totalLength += buf.length;\n    }\n  }\n\n  var buffer = new Buffer(totalLength);\n  var pos = 0;\n  for (var i = 0; i < list.length; i++) {\n    var buf = list[i];\n    buf.copy(buffer, pos);\n    pos += buf.length;\n  }\n  return buffer;\n};\n\n// Inspect\nBuffer.prototype.inspect = function inspect() {\n  var out = [],\n      len = this.length;\n\n  for (var i = 0; i < len; i++) {\n    out[i] = toHex(this.parent[i + this.offset]);\n    if (i == exports.INSPECT_MAX_BYTES) {\n      out[i + 1] = '...';\n      break;\n    }\n  }\n\n  return '<Buffer ' + out.join(' ') + '>';\n};\n\n\nBuffer.prototype.get = function get(i) {\n  if (i < 0 || i >= this.length) throw new Error('oob');\n  return this.parent[this.offset + i];\n};\n\n\nBuffer.prototype.set = function set(i, v) {\n  if (i < 0 || i >= this.length) throw new Error('oob');\n  return this.parent[this.offset + i] = v;\n};\n\n\n// write(string, offset = 0, length = buffer.length-offset, encoding = 'utf8')\nBuffer.prototype.write = function(string, offset, length, encoding) {\n  // Support both (string, offset, length, encoding)\n  // and the legacy (string, encoding, offset, length)\n  if (isFinite(offset)) {\n    if (!isFinite(length)) {\n      encoding = length;\n      length = undefined;\n    }\n  } else {  // legacy\n    var swap = encoding;\n    encoding = offset;\n    offset = length;\n    length = swap;\n  }\n\n  offset = +offset || 0;\n  var remaining = this.length - offset;\n  if (!length) {\n    length = remaining;\n  } else {\n    length = +length;\n    if (length > remaining) {\n      length = remaining;\n    }\n  }\n  encoding = String(encoding || 'utf8').toLowerCase();\n\n  var ret;\n  switch (encoding) {\n    case 'hex':\n      ret = this.parent.hexWrite(string, this.offset + offset, length);\n      break;\n\n    case 'utf8':\n    case 'utf-8':\n      ret = this.parent.utf8Write(string, this.offset + offset, length);\n      break;\n\n    case 'ascii':\n      ret = this.parent.asciiWrite(string, this.offset + offset, length);\n      break;\n\n    case 'binary':\n      ret = this.parent.binaryWrite(string, this.offset + offset, length);\n      break;\n\n    case 'base64':\n      // Warning: maxLength not taken into account in base64Write\n      ret = this.parent.base64Write(string, this.offset + offset, length);\n      break;\n\n    case 'ucs2':\n    case 'ucs-2':\n      ret = this.parent.ucs2Write(string, this.offset + offset, length);\n      break;\n\n    default:\n      throw new Error('Unknown encoding');\n  }\n\n  Buffer._charsWritten = SlowBuffer._charsWritten;\n\n  return ret;\n};\n\n\n// toString(encoding, start=0, end=buffer.length)\nBuffer.prototype.toString = function(encoding, start, end) {\n  encoding = String(encoding || 'utf8').toLowerCase();\n\n  if (typeof start == 'undefined' || start < 0) {\n    start = 0;\n  } else if (start > this.length) {\n    start = this.length;\n  }\n\n  if (typeof end == 'undefined' || end > this.length) {\n    end = this.length;\n  } else if (end < 0) {\n    end = 0;\n  }\n\n  start = start + this.offset;\n  end = end + this.offset;\n\n  switch (encoding) {\n    case 'hex':\n      return this.parent.hexSlice(start, end);\n\n    case 'utf8':\n    case 'utf-8':\n      return this.parent.utf8Slice(start, end);\n\n    case 'ascii':\n      return this.parent.asciiSlice(start, end);\n\n    case 'binary':\n      return this.parent.binarySlice(start, end);\n\n    case 'base64':\n      return this.parent.base64Slice(start, end);\n\n    case 'ucs2':\n    case 'ucs-2':\n      return this.parent.ucs2Slice(start, end);\n\n    default:\n      throw new Error('Unknown encoding');\n  }\n};\n\n\n// byteLength\nBuffer.byteLength = SlowBuffer.byteLength;\n\n\n// fill(value, start=0, end=buffer.length)\nBuffer.prototype.fill = function fill(value, start, end) {\n  value || (value = 0);\n  start || (start = 0);\n  end || (end = this.length);\n\n  if (typeof value === 'string') {\n    value = value.charCodeAt(0);\n  }\n  if (!(typeof value === 'number') || isNaN(value)) {\n    throw new Error('value is not a number');\n  }\n\n  if (end < start) throw new Error('end < start');\n\n  // Fill 0 bytes; we're done\n  if (end === start) return 0;\n  if (this.length == 0) return 0;\n\n  if (start < 0 || start >= this.length) {\n    throw new Error('start out of bounds');\n  }\n\n  if (end < 0 || end > this.length) {\n    throw new Error('end out of bounds');\n  }\n\n  return this.parent.fill(value,\n                          start + this.offset,\n                          end + this.offset);\n};\n\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function(target, target_start, start, end) {\n  var source = this;\n  start || (start = 0);\n  end || (end = this.length);\n  target_start || (target_start = 0);\n\n  if (end < start) throw new Error('sourceEnd < sourceStart');\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0;\n  if (target.length == 0 || source.length == 0) return 0;\n\n  if (target_start < 0 || target_start >= target.length) {\n    throw new Error('targetStart out of bounds');\n  }\n\n  if (start < 0 || start >= source.length) {\n    throw new Error('sourceStart out of bounds');\n  }\n\n  if (end < 0 || end > source.length) {\n    throw new Error('sourceEnd out of bounds');\n  }\n\n  // Are we oob?\n  if (end > this.length) {\n    end = this.length;\n  }\n\n  if (target.length - target_start < end - start) {\n    end = target.length - target_start + start;\n  }\n\n  return this.parent.copy(target.parent,\n                          target_start + target.offset,\n                          start + this.offset,\n                          end + this.offset);\n};\n\n\n// slice(start, end)\nBuffer.prototype.slice = function(start, end) {\n  if (end === undefined) end = this.length;\n  if (end > this.length) throw new Error('oob');\n  if (start > end) throw new Error('oob');\n\n  return new Buffer(this.parent, end - start, +start + this.offset);\n};\n\n\n// Legacy methods for backwards compatibility.\n\nBuffer.prototype.utf8Slice = function(start, end) {\n  return this.toString('utf8', start, end);\n};\n\nBuffer.prototype.binarySlice = function(start, end) {\n  return this.toString('binary', start, end);\n};\n\nBuffer.prototype.asciiSlice = function(start, end) {\n  return this.toString('ascii', start, end);\n};\n\nBuffer.prototype.utf8Write = function(string, offset) {\n  return this.write(string, offset, 'utf8');\n};\n\nBuffer.prototype.binaryWrite = function(string, offset) {\n  return this.write(string, offset, 'binary');\n};\n\nBuffer.prototype.asciiWrite = function(string, offset) {\n  return this.write(string, offset, 'ascii');\n};\n\nBuffer.prototype.readUInt8 = function(offset, noAssert) {\n  var buffer = this;\n\n  if (!noAssert) {\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  return buffer.parent[buffer.offset + offset];\n};\n\nfunction readUInt16(buffer, offset, isBigEndian, noAssert) {\n  var val = 0;\n\n\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 1 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  if (isBigEndian) {\n    val = buffer.parent[buffer.offset + offset] << 8;\n    val |= buffer.parent[buffer.offset + offset + 1];\n  } else {\n    val = buffer.parent[buffer.offset + offset];\n    val |= buffer.parent[buffer.offset + offset + 1] << 8;\n  }\n\n  return val;\n}\n\nBuffer.prototype.readUInt16LE = function(offset, noAssert) {\n  return readUInt16(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readUInt16BE = function(offset, noAssert) {\n  return readUInt16(this, offset, true, noAssert);\n};\n\nfunction readUInt32(buffer, offset, isBigEndian, noAssert) {\n  var val = 0;\n\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 3 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  if (isBigEndian) {\n    val = buffer.parent[buffer.offset + offset + 1] << 16;\n    val |= buffer.parent[buffer.offset + offset + 2] << 8;\n    val |= buffer.parent[buffer.offset + offset + 3];\n    val = val + (buffer.parent[buffer.offset + offset] << 24 >>> 0);\n  } else {\n    val = buffer.parent[buffer.offset + offset + 2] << 16;\n    val |= buffer.parent[buffer.offset + offset + 1] << 8;\n    val |= buffer.parent[buffer.offset + offset];\n    val = val + (buffer.parent[buffer.offset + offset + 3] << 24 >>> 0);\n  }\n\n  return val;\n}\n\nBuffer.prototype.readUInt32LE = function(offset, noAssert) {\n  return readUInt32(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readUInt32BE = function(offset, noAssert) {\n  return readUInt32(this, offset, true, noAssert);\n};\n\n\n/*\n * Signed integer types, yay team! A reminder on how two's complement actually\n * works. The first bit is the signed bit, i.e. tells us whether or not the\n * number should be positive or negative. If the two's complement value is\n * positive, then we're done, as it's equivalent to the unsigned representation.\n *\n * Now if the number is positive, you're pretty much done, you can just leverage\n * the unsigned translations and return those. Unfortunately, negative numbers\n * aren't quite that straightforward.\n *\n * At first glance, one might be inclined to use the traditional formula to\n * translate binary numbers between the positive and negative values in two's\n * complement. (Though it doesn't quite work for the most negative value)\n * Mainly:\n *  - invert all the bits\n *  - add one to the result\n *\n * Of course, this doesn't quite work in Javascript. Take for example the value\n * of -128. This could be represented in 16 bits (big-endian) as 0xff80. But of\n * course, Javascript will do the following:\n *\n * > ~0xff80\n * -65409\n *\n * Whoh there, Javascript, that's not quite right. But wait, according to\n * Javascript that's perfectly correct. When Javascript ends up seeing the\n * constant 0xff80, it has no notion that it is actually a signed number. It\n * assumes that we've input the unsigned value 0xff80. Thus, when it does the\n * binary negation, it casts it into a signed value, (positive 0xff80). Then\n * when you perform binary negation on that, it turns it into a negative number.\n *\n * Instead, we're going to have to use the following general formula, that works\n * in a rather Javascript friendly way. I'm glad we don't support this kind of\n * weird numbering scheme in the kernel.\n *\n * (BIT-MAX - (unsigned)val + 1) * -1\n *\n * The astute observer, may think that this doesn't make sense for 8-bit numbers\n * (really it isn't necessary for them). However, when you get 16-bit numbers,\n * you do. Let's go back to our prior example and see how this will look:\n *\n * (0xffff - 0xff80 + 1) * -1\n * (0x007f + 1) * -1\n * (0x0080) * -1\n */\nBuffer.prototype.readInt8 = function(offset, noAssert) {\n  var buffer = this;\n  var neg;\n\n  if (!noAssert) {\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  neg = buffer.parent[buffer.offset + offset] & 0x80;\n  if (!neg) {\n    return (buffer.parent[buffer.offset + offset]);\n  }\n\n  return ((0xff - buffer.parent[buffer.offset + offset] + 1) * -1);\n};\n\nfunction readInt16(buffer, offset, isBigEndian, noAssert) {\n  var neg, val;\n\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 1 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  val = readUInt16(buffer, offset, isBigEndian, noAssert);\n  neg = val & 0x8000;\n  if (!neg) {\n    return val;\n  }\n\n  return (0xffff - val + 1) * -1;\n}\n\nBuffer.prototype.readInt16LE = function(offset, noAssert) {\n  return readInt16(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readInt16BE = function(offset, noAssert) {\n  return readInt16(this, offset, true, noAssert);\n};\n\nfunction readInt32(buffer, offset, isBigEndian, noAssert) {\n  var neg, val;\n\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 3 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  val = readUInt32(buffer, offset, isBigEndian, noAssert);\n  neg = val & 0x80000000;\n  if (!neg) {\n    return (val);\n  }\n\n  return (0xffffffff - val + 1) * -1;\n}\n\nBuffer.prototype.readInt32LE = function(offset, noAssert) {\n  return readInt32(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readInt32BE = function(offset, noAssert) {\n  return readInt32(this, offset, true, noAssert);\n};\n\nfunction readFloat(buffer, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset + 3 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  return require('./buffer_ieee754').readIEEE754(buffer, offset, isBigEndian,\n      23, 4);\n}\n\nBuffer.prototype.readFloatLE = function(offset, noAssert) {\n  return readFloat(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readFloatBE = function(offset, noAssert) {\n  return readFloat(this, offset, true, noAssert);\n};\n\nfunction readDouble(buffer, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset + 7 < buffer.length,\n        'Trying to read beyond buffer length');\n  }\n\n  return require('./buffer_ieee754').readIEEE754(buffer, offset, isBigEndian,\n      52, 8);\n}\n\nBuffer.prototype.readDoubleLE = function(offset, noAssert) {\n  return readDouble(this, offset, false, noAssert);\n};\n\nBuffer.prototype.readDoubleBE = function(offset, noAssert) {\n  return readDouble(this, offset, true, noAssert);\n};\n\n\n/*\n * We have to make sure that the value is a valid integer. This means that it is\n * non-negative. It has no fractional component and that it does not exceed the\n * maximum allowed value.\n *\n *      value           The number to check for validity\n *\n *      max             The maximum value\n */\nfunction verifuint(value, max) {\n  assert.ok(typeof (value) == 'number',\n      'cannot write a non-number as a number');\n\n  assert.ok(value >= 0,\n      'specified a negative value for writing an unsigned value');\n\n  assert.ok(value <= max, 'value is larger than maximum value for type');\n\n  assert.ok(Math.floor(value) === value, 'value has a fractional component');\n}\n\nBuffer.prototype.writeUInt8 = function(value, offset, noAssert) {\n  var buffer = this;\n\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset < buffer.length,\n        'trying to write beyond buffer length');\n\n    verifuint(value, 0xff);\n  }\n\n  buffer.parent[buffer.offset + offset] = value;\n};\n\nfunction writeUInt16(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 1 < buffer.length,\n        'trying to write beyond buffer length');\n\n    verifuint(value, 0xffff);\n  }\n\n  if (isBigEndian) {\n    buffer.parent[buffer.offset + offset] = (value & 0xff00) >>> 8;\n    buffer.parent[buffer.offset + offset + 1] = value & 0x00ff;\n  } else {\n    buffer.parent[buffer.offset + offset + 1] = (value & 0xff00) >>> 8;\n    buffer.parent[buffer.offset + offset] = value & 0x00ff;\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function(value, offset, noAssert) {\n  writeUInt16(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeUInt16BE = function(value, offset, noAssert) {\n  writeUInt16(this, value, offset, true, noAssert);\n};\n\nfunction writeUInt32(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 3 < buffer.length,\n        'trying to write beyond buffer length');\n\n    verifuint(value, 0xffffffff);\n  }\n\n  if (isBigEndian) {\n    buffer.parent[buffer.offset + offset] = (value >>> 24) & 0xff;\n    buffer.parent[buffer.offset + offset + 1] = (value >>> 16) & 0xff;\n    buffer.parent[buffer.offset + offset + 2] = (value >>> 8) & 0xff;\n    buffer.parent[buffer.offset + offset + 3] = value & 0xff;\n  } else {\n    buffer.parent[buffer.offset + offset + 3] = (value >>> 24) & 0xff;\n    buffer.parent[buffer.offset + offset + 2] = (value >>> 16) & 0xff;\n    buffer.parent[buffer.offset + offset + 1] = (value >>> 8) & 0xff;\n    buffer.parent[buffer.offset + offset] = value & 0xff;\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function(value, offset, noAssert) {\n  writeUInt32(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeUInt32BE = function(value, offset, noAssert) {\n  writeUInt32(this, value, offset, true, noAssert);\n};\n\n\n/*\n * We now move onto our friends in the signed number category. Unlike unsigned\n * numbers, we're going to have to worry a bit more about how we put values into\n * arrays. Since we are only worrying about signed 32-bit values, we're in\n * slightly better shape. Unfortunately, we really can't do our favorite binary\n * & in this system. It really seems to do the wrong thing. For example:\n *\n * > -32 & 0xff\n * 224\n *\n * What's happening above is really: 0xe0 & 0xff = 0xe0. However, the results of\n * this aren't treated as a signed number. Ultimately a bad thing.\n *\n * What we're going to want to do is basically create the unsigned equivalent of\n * our representation and pass that off to the wuint* functions. To do that\n * we're going to do the following:\n *\n *  - if the value is positive\n *      we can pass it directly off to the equivalent wuint\n *  - if the value is negative\n *      we do the following computation:\n *         mb + val + 1, where\n *         mb   is the maximum unsigned value in that byte size\n *         val  is the Javascript negative integer\n *\n *\n * As a concrete value, take -128. In signed 16 bits this would be 0xff80. If\n * you do out the computations:\n *\n * 0xffff - 128 + 1\n * 0xffff - 127\n * 0xff80\n *\n * You can then encode this value as the signed version. This is really rather\n * hacky, but it should work and get the job done which is our goal here.\n */\n\n/*\n * A series of checks to make sure we actually have a signed 32-bit number\n */\nfunction verifsint(value, max, min) {\n  assert.ok(typeof (value) == 'number',\n      'cannot write a non-number as a number');\n\n  assert.ok(value <= max, 'value larger than maximum allowed value');\n\n  assert.ok(value >= min, 'value smaller than minimum allowed value');\n\n  assert.ok(Math.floor(value) === value, 'value has a fractional component');\n}\n\nfunction verifIEEE754(value, max, min) {\n  assert.ok(typeof (value) == 'number',\n      'cannot write a non-number as a number');\n\n  assert.ok(value <= max, 'value larger than maximum allowed value');\n\n  assert.ok(value >= min, 'value smaller than minimum allowed value');\n}\n\nBuffer.prototype.writeInt8 = function(value, offset, noAssert) {\n  var buffer = this;\n\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset < buffer.length,\n        'Trying to write beyond buffer length');\n\n    verifsint(value, 0x7f, -0x80);\n  }\n\n  if (value >= 0) {\n    buffer.writeUInt8(value, offset, noAssert);\n  } else {\n    buffer.writeUInt8(0xff + value + 1, offset, noAssert);\n  }\n};\n\nfunction writeInt16(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 1 < buffer.length,\n        'Trying to write beyond buffer length');\n\n    verifsint(value, 0x7fff, -0x8000);\n  }\n\n  if (value >= 0) {\n    writeUInt16(buffer, value, offset, isBigEndian, noAssert);\n  } else {\n    writeUInt16(buffer, 0xffff + value + 1, offset, isBigEndian, noAssert);\n  }\n}\n\nBuffer.prototype.writeInt16LE = function(value, offset, noAssert) {\n  writeInt16(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeInt16BE = function(value, offset, noAssert) {\n  writeInt16(this, value, offset, true, noAssert);\n};\n\nfunction writeInt32(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 3 < buffer.length,\n        'Trying to write beyond buffer length');\n\n    verifsint(value, 0x7fffffff, -0x80000000);\n  }\n\n  if (value >= 0) {\n    writeUInt32(buffer, value, offset, isBigEndian, noAssert);\n  } else {\n    writeUInt32(buffer, 0xffffffff + value + 1, offset, isBigEndian, noAssert);\n  }\n}\n\nBuffer.prototype.writeInt32LE = function(value, offset, noAssert) {\n  writeInt32(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeInt32BE = function(value, offset, noAssert) {\n  writeInt32(this, value, offset, true, noAssert);\n};\n\nfunction writeFloat(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 3 < buffer.length,\n        'Trying to write beyond buffer length');\n\n    verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38);\n  }\n\n  require('./buffer_ieee754').writeIEEE754(buffer, value, offset, isBigEndian,\n      23, 4);\n}\n\nBuffer.prototype.writeFloatLE = function(value, offset, noAssert) {\n  writeFloat(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeFloatBE = function(value, offset, noAssert) {\n  writeFloat(this, value, offset, true, noAssert);\n};\n\nfunction writeDouble(buffer, value, offset, isBigEndian, noAssert) {\n  if (!noAssert) {\n    assert.ok(value !== undefined && value !== null,\n        'missing value');\n\n    assert.ok(typeof (isBigEndian) === 'boolean',\n        'missing or invalid endian');\n\n    assert.ok(offset !== undefined && offset !== null,\n        'missing offset');\n\n    assert.ok(offset + 7 < buffer.length,\n        'Trying to write beyond buffer length');\n\n    verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308);\n  }\n\n  require('./buffer_ieee754').writeIEEE754(buffer, value, offset, isBigEndian,\n      52, 8);\n}\n\nBuffer.prototype.writeDoubleLE = function(value, offset, noAssert) {\n  writeDouble(this, value, offset, false, noAssert);\n};\n\nBuffer.prototype.writeDoubleBE = function(value, offset, noAssert) {\n  writeDouble(this, value, offset, true, noAssert);\n};\n\nSlowBuffer.prototype.readUInt8 = Buffer.prototype.readUInt8;\nSlowBuffer.prototype.readUInt16LE = Buffer.prototype.readUInt16LE;\nSlowBuffer.prototype.readUInt16BE = Buffer.prototype.readUInt16BE;\nSlowBuffer.prototype.readUInt32LE = Buffer.prototype.readUInt32LE;\nSlowBuffer.prototype.readUInt32BE = Buffer.prototype.readUInt32BE;\nSlowBuffer.prototype.readInt8 = Buffer.prototype.readInt8;\nSlowBuffer.prototype.readInt16LE = Buffer.prototype.readInt16LE;\nSlowBuffer.prototype.readInt16BE = Buffer.prototype.readInt16BE;\nSlowBuffer.prototype.readInt32LE = Buffer.prototype.readInt32LE;\nSlowBuffer.prototype.readInt32BE = Buffer.prototype.readInt32BE;\nSlowBuffer.prototype.readFloatLE = Buffer.prototype.readFloatLE;\nSlowBuffer.prototype.readFloatBE = Buffer.prototype.readFloatBE;\nSlowBuffer.prototype.readDoubleLE = Buffer.prototype.readDoubleLE;\nSlowBuffer.prototype.readDoubleBE = Buffer.prototype.readDoubleBE;\nSlowBuffer.prototype.writeUInt8 = Buffer.prototype.writeUInt8;\nSlowBuffer.prototype.writeUInt16LE = Buffer.prototype.writeUInt16LE;\nSlowBuffer.prototype.writeUInt16BE = Buffer.prototype.writeUInt16BE;\nSlowBuffer.prototype.writeUInt32LE = Buffer.prototype.writeUInt32LE;\nSlowBuffer.prototype.writeUInt32BE = Buffer.prototype.writeUInt32BE;\nSlowBuffer.prototype.writeInt8 = Buffer.prototype.writeInt8;\nSlowBuffer.prototype.writeInt16LE = Buffer.prototype.writeInt16LE;\nSlowBuffer.prototype.writeInt16BE = Buffer.prototype.writeInt16BE;\nSlowBuffer.prototype.writeInt32LE = Buffer.prototype.writeInt32LE;\nSlowBuffer.prototype.writeInt32BE = Buffer.prototype.writeInt32BE;\nSlowBuffer.prototype.writeFloatLE = Buffer.prototype.writeFloatLE;\nSlowBuffer.prototype.writeFloatBE = Buffer.prototype.writeFloatBE;\nSlowBuffer.prototype.writeDoubleLE = Buffer.prototype.writeDoubleLE;\nSlowBuffer.prototype.writeDoubleBE = Buffer.prototype.writeDoubleBE;\n\n});\n\nrequire.define(\"/node_modules/buffer-browserify/node_modules/base64-js/package.json\",function(require,module,exports,__dirname,__filename,process,global){module.exports = {\"main\":\"lib/b64.js\"}\n});\n\nrequire.define(\"/node_modules/buffer-browserify/node_modules/base64-js/lib/b64.js\",function(require,module,exports,__dirname,__filename,process,global){(function (exports) {\n\t'use strict';\n\n\tvar lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\tfunction b64ToByteArray(b64) {\n\t\tvar i, j, l, tmp, placeHolders, arr;\n\t\n\t\tif (b64.length % 4 > 0) {\n\t\t\tthrow 'Invalid string. Length must be a multiple of 4';\n\t\t}\n\n\t\t// the number of equal signs (place holders)\n\t\t// if there are two placeholders, than the two characters before it\n\t\t// represent one byte\n\t\t// if there is only one, then the three characters before it represent 2 bytes\n\t\t// this is just a cheap hack to not do indexOf twice\n\t\tplaceHolders = b64.indexOf('=');\n\t\tplaceHolders = placeHolders > 0 ? b64.length - placeHolders : 0;\n\n\t\t// base64 is 4/3 + up to two characters of the original data\n\t\tarr = [];//new Uint8Array(b64.length * 3 / 4 - placeHolders);\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tl = placeHolders > 0 ? b64.length - 4 : b64.length;\n\n\t\tfor (i = 0, j = 0; i < l; i += 4, j += 3) {\n\t\t\ttmp = (lookup.indexOf(b64[i]) << 18) | (lookup.indexOf(b64[i + 1]) << 12) | (lookup.indexOf(b64[i + 2]) << 6) | lookup.indexOf(b64[i + 3]);\n\t\t\tarr.push((tmp & 0xFF0000) >> 16);\n\t\t\tarr.push((tmp & 0xFF00) >> 8);\n\t\t\tarr.push(tmp & 0xFF);\n\t\t}\n\n\t\tif (placeHolders === 2) {\n\t\t\ttmp = (lookup.indexOf(b64[i]) << 2) | (lookup.indexOf(b64[i + 1]) >> 4);\n\t\t\tarr.push(tmp & 0xFF);\n\t\t} else if (placeHolders === 1) {\n\t\t\ttmp = (lookup.indexOf(b64[i]) << 10) | (lookup.indexOf(b64[i + 1]) << 4) | (lookup.indexOf(b64[i + 2]) >> 2);\n\t\t\tarr.push((tmp >> 8) & 0xFF);\n\t\t\tarr.push(tmp & 0xFF);\n\t\t}\n\n\t\treturn arr;\n\t}\n\n\tfunction uint8ToBase64(uint8) {\n\t\tvar i,\n\t\t\textraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes\n\t\t\toutput = \"\",\n\t\t\ttemp, length;\n\n\t\tfunction tripletToBase64 (num) {\n\t\t\treturn lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n\t\t};\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {\n\t\t\ttemp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);\n\t\t\toutput += tripletToBase64(temp);\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tswitch (extraBytes) {\n\t\t\tcase 1:\n\t\t\t\ttemp = uint8[uint8.length - 1];\n\t\t\t\toutput += lookup[temp >> 2];\n\t\t\t\toutput += lookup[(temp << 4) & 0x3F];\n\t\t\t\toutput += '==';\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\ttemp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]);\n\t\t\t\toutput += lookup[temp >> 10];\n\t\t\t\toutput += lookup[(temp >> 4) & 0x3F];\n\t\t\t\toutput += lookup[(temp << 2) & 0x3F];\n\t\t\t\toutput += '=';\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tmodule.exports.toByteArray = b64ToByteArray;\n\tmodule.exports.fromByteArray = uint8ToBase64;\n}());\n\n});\n\nrequire.define(\"/node_modules/buffer-browserify/buffer_ieee754.js\",function(require,module,exports,__dirname,__filename,process,global){exports.readIEEE754 = function(buffer, offset, isBE, mLen, nBytes) {\n  var e, m,\n      eLen = nBytes * 8 - mLen - 1,\n      eMax = (1 << eLen) - 1,\n      eBias = eMax >> 1,\n      nBits = -7,\n      i = isBE ? 0 : (nBytes - 1),\n      d = isBE ? 1 : -1,\n      s = buffer[offset + i];\n\n  i += d;\n\n  e = s & ((1 << (-nBits)) - 1);\n  s >>= (-nBits);\n  nBits += eLen;\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n\n  m = e & ((1 << (-nBits)) - 1);\n  e >>= (-nBits);\n  nBits += mLen;\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n\n  if (e === 0) {\n    e = 1 - eBias;\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity);\n  } else {\n    m = m + Math.pow(2, mLen);\n    e = e - eBias;\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\n\nexports.writeIEEE754 = function(buffer, value, offset, isBE, mLen, nBytes) {\n  var e, m, c,\n      eLen = nBytes * 8 - mLen - 1,\n      eMax = (1 << eLen) - 1,\n      eBias = eMax >> 1,\n      rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),\n      i = isBE ? (nBytes - 1) : 0,\n      d = isBE ? -1 : 1,\n      s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;\n\n  value = Math.abs(value);\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0;\n    e = eMax;\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2);\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--;\n      c *= 2;\n    }\n    if (e + eBias >= 1) {\n      value += rt / c;\n    } else {\n      value += rt * Math.pow(2, 1 - eBias);\n    }\n    if (value * c >= 2) {\n      e++;\n      c /= 2;\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0;\n      e = eMax;\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen);\n      e = e + eBias;\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n      e = 0;\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n\n  e = (e << mLen) | m;\n  eLen += mLen;\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n\n  buffer[offset + i - d] |= s * 128;\n};\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/heap.js\",function(require,module,exports,__dirname,__filename,process,global){// Binary Heap\n// By: Marjin Haverbeke\n// Web: http://eloquentjavascript.net/appendix2.html\n\nfunction BinaryHeap(scoreFunction){\n  this.content = [];\n  this.scoreFunction = scoreFunction;\n}\n\nBinaryHeap.prototype = {\n  push: function(element) {\n    // Add the new element to the end of the array.\n    this.content.push(element);\n    // Allow it to bubble up.\n    this.bubbleUp(this.content.length - 1);\n  },\n\n  pop: function() {\n    // Store the first element so we can return it later.\n    var result = this.content[0];\n    // Get the element at the end of the array.\n    var end = this.content.pop();\n    // If there are any elements left, put the end element at the\n    // start, and let it sink down.\n    if (this.content.length > 0) {\n      this.content[0] = end;\n      this.sinkDown(0);\n    }\n    return result;\n  },\n\n  remove: function(node) {\n    var len = this.content.length;\n    // To remove a value, we must search through the array to find\n    // it.\n    for (var i = 0; i < len; i++) {\n      if (this.content[i] == node) {\n        // When it is found, the process seen in 'pop' is repeated\n        // to fill up the hole.\n        var end = this.content.pop();\n        if (i != len - 1) {\n          this.content[i] = end;\n          if (this.scoreFunction(end) < this.scoreFunction(node))\n            this.bubbleUp(i);\n          else\n            this.sinkDown(i);\n        }\n        return;\n      }\n    }\n  },\n\n  size: function() {\n    return this.content.length;\n  },\n\n  bubbleUp: function(n) {\n    // Fetch the element that has to be moved.\n    var element = this.content[n];\n    // When at 0, an element can not go up any further.\n    while (n > 0) {\n      // Compute the parent element's index, and fetch it.\n      var parentN = Math.floor((n + 1) / 2) - 1,\n          parent = this.content[parentN];\n      // Swap the elements if the parent is greater.\n      if (this.scoreFunction(element) < this.scoreFunction(parent)) {\n        this.content[parentN] = element;\n        this.content[n] = parent;\n        // Update 'n' to continue at the new position.\n        n = parentN;\n      }\n      // Found a parent that is less, no need to move it further.\n      else {\n        break;\n      }\n    }\n  },\n\n  sinkDown: function(n) {\n    // Look up the target element and its score.\n    var length = this.content.length,\n        element = this.content[n],\n        elemScore = this.scoreFunction(element);\n\n    while(true) {\n      // Compute the indices of the child elements.\n      var child2N = (n + 1) * 2, child1N = child2N - 1;\n      // This is used to store the new position of the element,\n      // if any.\n      var swap = null;\n      // If the first child exists (is inside the array)...\n      if (child1N < length) {\n        // Look it up and compute its score.\n        var child1 = this.content[child1N],\n            child1Score = this.scoreFunction(child1);\n        // If the score is less than our element's, we need to swap.\n        if (child1Score < elemScore)\n          swap = child1N;\n      }\n      // Do the same checks for the other child.\n      if (child2N < length) {\n        var child2 = this.content[child2N],\n            child2Score = this.scoreFunction(child2);\n        if (child2Score < (swap == null ? elemScore : child1Score))\n          swap = child2N;\n      }\n\n      // If the element needs to be moved, swap it, and continue.\n      if (swap != null) {\n        this.content[n] = this.content[swap];\n        this.content[swap] = element;\n        n = swap;\n      }\n      // Otherwise, we are done.\n      else {\n        break;\n      }\n    }\n  }\n};\n\n\nif(typeof(exports) !== \"undefined\") {\n  exports.BinaryHeap = BinaryHeap;\n}\n\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/shapes.js\",function(require,module,exports,__dirname,__filename,process,global){\"use strict\";\nvar repair = require('./repair.js');\n\n//Creates a grid mesh\nfunction grid_mesh(args) {\n  var nx = args.width   || 10;\n  var ny = args.height  || 10;\n\n  var positions = new Array((nx+1) * (ny+1));\n  for(var j=0; j<=ny; ++j) {\n    for(var i=0; i<=nx; ++i) {\n      positions[i + (nx+1)*j] = [i, j, 0];\n    }\n  }\n  \n  function p(x,y) { return x + (nx+1)*y; };\n  \n  var faces     = [];\n  for(var j=0; j<ny; ++j) {\n    for(var i=0; i<nx; ++i) {\n      faces.push([ p(i,j), p(i+1, j), p(i, j+1) ]);\n      faces.push([ p(i+1,j), p(i+1,j+1), p(i,j+1) ]);\n    }\n  }\n\n  return {positions: positions, faces: faces};\n}\n\n//Creates a cubical mesh\n// resolution is an integer representing number of subdivisions per linear dimension\n// scale is a 3d vector representing the scale of the cube\nfunction cube_mesh(args) {\n\n  var resolution = args.resolution || 10;\n  var scale      = typeof(args.scale) === \"number\" ? [args.scale, args.scale, args.scale] : (args.scale || [1.0, 1.0, 1.0]);\n\n  var radius = resolution >> 1;\n  var side_len = 2*radius + 1;\n  function p(x,y,s) { \n    return x + side_len * (y + side_len * s); \n  }\n  \n  var positions = new Array(6 * side_len * side_len);\n  var faces = [];  \n  \n  for(var d=0; d<3; ++d) {\n    var u = (d+1)%3;\n    var v = (d+2)%3;\n    \n    for(var s=0; s<2; ++s) {\n      var f = 2*d + s;\n      var x = new Array(3);\n      \n      x[u] = -radius;\n      x[v] = -radius;\n      x[d] = (1 - 2*s) * radius;\n    \n      for(var j=0; j<side_len; ++j, ++x[v]) {\n        x[u] = -radius;\n        for(var i=0; i<side_len; ++i, ++x[u]) {\n          var pos = new Array(3);\n          for(var k=0; k<3; ++k) {\n            pos[k] = x[k] * scale[k] / radius;\n          }\n        \n          positions[p(i, j, f)] = pos;\n          \n          if(i < side_len-1 && j < side_len-1) {\n            if(s) {\n              faces.push([ p(i,j,f), p(i,j+1,f), p(i+1,j,f) ]);\n              faces.push([ p(i+1,j,f), p(i,j+1,f), p(i+1,j+1,f) ]);          \n            } else {\n              faces.push([ p(i,j,f), p(i+1,j,f), p(i,j+1,f) ]);\n              faces.push([ p(i,j+1,f), p(i+1,j,f), p(i+1,j+1,f) ]);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  //Glue 6 faces together and return\n  var tol = 0.5 * Math.min(scale[0], Math.min(scale[1], scale[2])) / radius;\n  return repair.fuse_vertices({positions: positions, faces: faces}, tol);\n};\n\n\n//Creates a spherical mesh\n//  resolution is an integer representing number of (vertices/6)^(1/2)\n//  radius is the radius of the sphere\nfunction sphere_mesh(args) {\n  var resolution = args.resolution || 10;\n  var radius     = args.radius || 1.0;\n\n  var base = cube_mesh({ resolution: resolution });\n  \n  for(var i=0; i<base.positions.length; ++i) {\n    var p = base.positions[i];\n    var l = 0.0;\n    for(var j=0; j<3; ++j) {\n      l += p[j] * p[j];\n    }\n    l = radius / Math.sqrt(l);\n    for(var j=0; j<3; ++j) {\n      p[j] *= l;\n    }\n  }\n  \n  return base;\n}\n\n\nexports.grid_mesh = grid_mesh;\nexports.cube_mesh = cube_mesh;\nexports.sphere_mesh = sphere_mesh;\n\n});\n\nrequire.define(\"/node_modules/trimesh/src/loop_subdivision.js\",function(require,module,exports,__dirname,__filename,process,global){var topology = require('./topology.js');\n\nfunction opposite(u, v, f) {\n  for(var i=0; i<3; ++i) {\n    if(f[i] !== u && f[i] !== v) {\n      return f[i];\n    }\n  }\n  return 0;\n}\n\n//A super inefficient implementation of Loop's algorithm\nexports.loop_subdivision = function(args) {\n  var positions   = args.positions;\n  var faces       = args.faces;\n  var edges       = args.edges || topology.edges({faces: faces});\n  var stars       = args.stars || topology.vertex_stars({ vertex_count: positions.length, faces: faces });\n  var npositions  = [];\n  var nfaces      = [];\n  var e_indices   = {};\n  var v_indices   = new Array(positions.length);  \n  \n  var e_verts = new Array(3);\n  var v_verts = new Array(3);\n  \n  for(var f=0; f<faces.length; ++f) {\n    var face = faces[f];\n    \n    for(var d=0; d<3; ++d) {\n      var v = face[d];\n      var u = face[(d+1)%3];\n      var e = [u,v];\n      e.sort();\n      \n      if(e in e_indices) {\n        e_verts[d] = e_indices[e];\n      } else {\n        //Compute edge-vertex\n        var wing = edges[e];\n        var v0 = positions[u];\n        var v1 = positions[v];\n        var vertex = new Array(3);\n        \n        if(wing.length === 2) {\n          var v2 = positions[opposite(u, v, faces[wing[0]])];\n          var v3 = positions[opposite(u, v, faces[wing[1]])];\n          \n          for(var i=0; i<3; ++i) {\n            vertex[i] = (3.0 * (v0[i] + v1[i]) + v2[i] + v3[i]) / 8.0;\n          }\n        } else {\n          for(var i=0; i<3; ++i) {\n            vertex[i] = 0.5 * (v0[i] + v1[i]);\n          }\n        }\n        \n        //Store vertex and continue\n        e_indices[e] = e_verts[d] = npositions.length;\n        npositions.push(vertex);\n      }\n      \n      if(v in v_indices) {\n        v_verts[d] = v_indices[v];\n      } else {\n        //Compute vertex-vertex weight\n        \n        //First, extract vertex neighborhood (slow and stupid here)\n        var star = stars[v];\n        var nbhd = [v];\n        for(var i=0; i<star.length; ++i) {\n          var tri = faces[star[i]];\n          for(var j=0; j<3; ++j) {\n            if(nbhd.indexOf(tri[j]) !== -1) {\n              nbhd.push(tri[j]);\n            }\n          }\n        }\n        \n        //Next, compute weights\n        var beta = (star.length === 3 ? 3.0/16.0 : 3.0/(8.0*star.length) );\n        var center_weight = 1.0 - star.length * beta;\n        \n        //Finally sum up weights\n        var pos  = positions[v];\n        var vertex = new Array(3);\n        for(var i=0; i<3; ++i) {\n          vertex[i] = center_weight * pos[i];\n        }\n        for(var i=1; i<nbhd.length; ++i) {\n          var p = positions[nbhd[i]];\n          for(var j=0; j<3; ++j) {\n            vertex[j] += beta * p[j];\n          }\n        }\n\n        //Store result and continue        \n        v_verts[d] = v_indices[v] = npositions.length;\n        npositions.push(vertex);\n      }\n    }\n    \n    //Add subdivided faces\n    nfaces.push([v_verts[0], e_verts[0], e_verts[2]]);\n    nfaces.push([e_verts[0], e_verts[1], e_verts[2]]);\n    nfaces.push([e_verts[0], v_verts[1], e_verts[1]]);\n    nfaces.push([e_verts[1], v_verts[2], e_verts[2]]);\n  }\n  \n  return { positions: npositions, faces: nfaces };\n};\n\n});\n\nrequire.define(\"/meshlife.js\",function(require,module,exports,__dirname,__filename,process,global){\"use strict\";\n\nvar trimesh = require('trimesh');\nvar EPSILON = 1e-6;\n\nfunction sigmoid(x, a, b) {\n  return \"(1.0/(1.0+Math.exp(-4.0*((X)-(A))/(B))))\".replace(\"X\", x).replace(\"A\", a).replace(\"B\", b);\n}\n\nfunction sigmoid_n(x, a, b, alpha_n) {\n  return \"(\" + sigmoid(x, a, alpha_n) + \"*(1.0-\" + sigmoid(x, b, alpha_n) + \"))\";\n}\n\nfunction ColumnEntry(c, v) {\n  this.column = parseInt(c);\n  this.value  = v;\n}\n\n//Compute weight associated to polygon\nvar CLIPPED = new Array(5);\nvar PQ = new Array(3);\nvar PR = new Array(3);\n(function() {\n  for(var i=0; i<5; ++i) {\n    CLIPPED[i] = new Array(3);\n  }\n})();\n\n\nfunction perp(a, b) {\n  var s = 0.0;\n  for(var i=0; i<3; ++i) {\n    var u = (i+1)%3;\n    var v = (i+2)%3;\n    var d = a[u] * b[v] - a[v] * b[u];\n    s += d * d;\n  }\n  return Math.sqrt(s);\n}\n\n\nfunction area(a, b, c) {\n  var ab = new Array(3);\n  var ac = new Array(3);\n  for(var i=0; i<3; ++i) {\n    ab[i] = b[i] - a[i];\n    ac[i] = c[i] - a[i];\n  }\n  \n  return 0.5 * perp(ab, ac);\n}\n\n\nfunction weight(a, b, c, da, db, dc, r) {\n\n  //First clip polygon\n  var weights = [da - r, db - r, dc - r];\n  var signs = new Array(3);\n  var all_in = true;\n  var all_out = true;\n  for(var i=0; i<3; ++i) {\n    signs[i] = weights[i] < 0;\n    \n    all_out = all_out && !signs[i];\n    all_in  = all_in  &&  signs[i]\n  }\n  \n  //Check for early out\n  if(all_out) { return 0.0; }\n  if(all_in)  { return area(a, b, c) / 3.0; }\n  \n  var poly = [a, b, c];\n  var clip_count = 0;\n  for(var i=0; i<3; ++i) {\n    \n    var n = (i+1)%3;\n    var cs = signs[i];\n    var ns = signs[n];\n    \n    if(cs) {\n      for(var j=0; j<3; ++j) {\n        CLIPPED[clip_count][j] = poly[i][j];\n      }\n      clip_count++;\n    }\n    \n    if(cs !== ns) {\n      var cw = weights[i];\n      var nw = weights[n];\n      var t = cw / (cw - nw);\n      var P = poly[i];\n      var Q = poly[(i+1)%3];\n      for(var j=0; j<3; ++j) {\n        CLIPPED[clip_count][j] = (1.0 - t) * P[j] + t * Q[j];\n      }\n      clip_count++;\n    }\n  }\n  \n  //Now compute weight\n  var w = 0.0;\n  var centroid = new Array(3);\n  for(var i=2; i<clip_count; ++i) {\n    var P = CLIPPED[0];\n    var Q = CLIPPED[(i-1)];\n    var R = CLIPPED[i];\n\n    for(var j=0; j<3; ++j) {\n      centroid[j] = (P[j] + Q[j] + R[j]) / 3.0;\n    }\n  \n    var alpha = area(P, Q, R);\n    w += alpha * area(centroid, b, c);\n  }\n \n  //Finally, return scaled weight\n  var scale = area(a,b,c);\n  if(Math.abs(scale) < EPSILON) {\n    return 0.0;\n  }\n  return w / scale;\n}\n\n//Computes the stiffness matrix for the system\nfunction stiffness_matrix(args) {\n\n  var positions     = args.positions;\n  var faces         = args.faces;\n  var stars         = args.stars;\n  var inner_radius  = args.inner_radius;\n  var outer_radius  = args.outer_radius;\n  \n  var compare_column = new Function(\"a\", \"b\", \"return a.column - b.column;\");\n  \n  //Compute length of longest edge in mesh\n  var max_edge_len = 0.0;\n  for(var i=0; i<faces.length; ++i) {\n    var face = faces[i];\n    \n    for(var j=0; j<face.length; ++j) {\n      var e0 = face[j];\n      var e1 = face[(j+1)%3];\n      var v0 = positions[e0];\n      var v1 = positions[e1];\n      var d = 0.0;\n      for(var k=0; k<3; ++k) {\n        d += Math.pow(v0[k]-v1[k], 2)\n      }\n      max_edge_len = Math.max(max_edge_len, d);\n    }\n  }\n  max_edge_len = Math.sqrt(max_edge_len);\n  \n  //Arguments to distance transform\n  var distance_args = {\n    positions: positions,\n    faces: faces,\n    initial_vertex: 0,\n    stars: stars,\n    max_distance: outer_radius + 2*max_edge_len\n  };\n  \n  var K_inner = new Array(positions.length);\n  var K_outer = new Array(positions.length);\n  \n  for(var i=0; i<positions.length; ++i) {\n  \n    distance_args.initial_vertex = i;\n    var distances = trimesh.geodesic_distance(distance_args);\n    \n    var row_inner = [];\n    var row_outer = [];\n    \n    var inner_weight = 0.0;\n    var outer_weight = 0.0;\n    \n    for(var j in distances) {\n      var dist = distances[j];\n      \n      //Compute vertex weight\n      var wi = 0.0;\n      var wo = 0.0;\n      var star = stars[j];\n      for(var k=0; k<star.length; ++k) {\n        var tri = faces[star[k]];\n        \n        //Get root vertex\n        var n = 0;\n        if(tri[1] === j) {\n          n = 1;\n        } else if(tri[2] === j) {\n          n = 2;\n        }\n        var m = (n+1)%3;\n        var l = (n+2)%3;\n        \n        //Compute distances\n        var a = positions[tri[n]];\n        var b = positions[tri[m]];\n        var c = positions[tri[l]];\n        \n        var da = distances[tri[n]] ;\n        var db = tri[m] in distances ? distances[tri[m]] : outer_radius+2*max_edge_len;\n        var dc = tri[l] in distances ? distances[tri[l]] : outer_radius+2*max_edge_len;\n        \n        //Compute weights\n        wi += weight(a, b, c, da, db, dc, inner_radius);\n        wo += weight(a, b, c, da, db, dc, outer_radius);\n      }\n      \n      if(wi > EPSILON) {\n        row_inner.push(new ColumnEntry(j, wi));\n        inner_weight += wi;\n      }\n      if(wo - wi > EPSILON) {\n        row_outer.push(new ColumnEntry(j, wo - wi));\n        outer_weight += wo - wi;\n      }\n    }\n  \n    //Rescale inner matrix\n    var s = 1.0 / inner_weight;\n    for(var j=0; j<row_inner.length; ++j) {\n      row_inner[j].value *= s;\n    }\n    row_inner.sort(compare_column);\n    K_inner[i] = row_inner;\n    \n    //Rescale outer matrix\n    var s = 1.0 / outer_weight;\n    for(var j=0; j<row_outer.length; ++j) {\n      row_outer[j].value *= s;\n    }\n    row_outer.sort(compare_column);\n    K_outer[i] = row_outer;\n  }\n  \n  return { K_inner: K_inner, K_outer: K_outer };\n};\n\n\nvar STEP_FUNC = {\n  \"discrete\": \"f\",\n  \"smooth1\": \"Math.min(1.0,Math.max(0.0,g+dt*(2.0*f-1.0)))\",\n  \"smooth2\": \"Math.min(1.0,Math.max(0.0,g+dt*(f-g)))\",\n  \"smooth3\": \"Math.min(1.0,Math.max(0.0,m+dt*(2.0*f-1.0)))\",\n  \"smooth4\": \"Math.min(1.0,Math.max(0.0,m+dt*(f-m)))\",\n};\n\n\nfunction MeshLife(params) {\n\n  if(!params) {\n    params = {};\n  }\n  \n  this.positions    = params.positions || [];\n  this.faces        = params.faces || [];\n  this.vertex_count = this.positions.length;\n  this.stars        = params.stars || trimesh.vertex_stars({\n                              vertex_count: this.vertex_count,\n                              faces: this.faces });\n  this.outer_radius = params.outer_radius || 1.0;\n  this.inner_radius = params.inner_radius || this.outer_radius / 3.0;\n  this.alpha_n      = params.alpha_n || 0.028;\n  this.alpha_m      = params.alpha_m || 0.147;\n  this.life_range   = params.life_range || [ 0.278, 0.365 ];\n  this.death_range  = params.death_range || [ 0.267, 0.445 ];\n  this.step_mode    = params.step_mode || \"discrete\";\n  this.delta_t      = params.delta_t || 0.01;\n \n  //Compile action \n  var prog_string = [ \n      \"var w=\" + sigmoid(\"m\", \"0.5\", this.alpha_m) + \";\",\n      \"var wi=1.0-w;\",\n      \"var f = \" + sigmoid_n(\"n\", \n                    \"wi*\" + this.life_range[0] + \"+w*\" + this.death_range[0], \n                    \"wi*\" + this.life_range[1] + \"+w*\" + this.death_range[1],\n                    this.alpha_n) + \";\",\n      \"var dt = \" + this.delta_t + \";\",\n      \"return \" + STEP_FUNC[this.step_mode] + \";\"\n    ].join(\"\\n\");\n  this.action = new Function(\"n\", \"m\", \"g\", prog_string);\n  \n  //Build stiffness matrix\n  if(params.K_inner && params.K_outer) {\n    this.K_inner      = params.K_inner;\n    this.K_outer      = params.K_outer;\n  } else {\n    var K = stiffness_matrix(this);\n    this.K_inner      = K.K_inner;\n    this.K_outer      = K.K_outer;\n  }\n    \n  //Allocate state buffers\n  this.state        = new Float32Array(this.vertex_count);\n  this.next_state   = new Float32Array(this.vertex_count);\n  for(var i=0; i<this.vertex_count; ++i) {\n    this.state[i] = this.next_state[i] = 0.0;\n  }\n}\n\n\n//Adds a cell at a given point in the mesh\nMeshLife.prototype.splat = function(vertex_num) {\n  var row     = this.K_inner[vertex_num];\n  var state   = this.state;\n  for(var i=0; i<row.length; ++i) {\n    var entry = row[i];\n    state[entry.column] = 1.0;\n    //state[entry.column] += entry.value / row[0].value;\n  }\n}\n\n\n//Steps the simulation one time step forward\nMeshLife.prototype.step = function() {\n\n  var K_inner       = this.K_inner;\n  var K_outer       = this.K_outer;\n  var state         = this.state;\n  var nstate        = this.next_state;\n  var S             = this.action;\n  var vertex_count  = this.vertex_count;\n\n  for(var i=0; i<vertex_count; ++i) {\n    \n    var M = 0.0;\n    var row_inner = K_inner[i];\n    for(var j=0; j<row_inner.length; ++j) {\n      var entry = row_inner[j];\n      M += entry.value * state[entry.column];\n    }\n    \n    var N = 0.0;\n    var row_outer = K_outer[i];\n    for(var j=0; j<row_outer.length; ++j) {\n      var entry = row_outer[j];\n      N += entry.value * state[entry.column];\n    }\n    \n    nstate[i] = S(N, M, state[i]);\n  }\n\n  //Swap buffers\n  var tmp = this.state;\n  this.state = this.next_state;\n  this.next_state = tmp;\n};\n\n\nexports.MeshLife = MeshLife;\n\n});\n\nrequire.define(\"/arcball.js\",function(require,module,exports,__dirname,__filename,process,global){//Simple arcball camera\n\nvar EPSILON = 1e-8;\n\nfunction qmult(a, b) {\n  return [ a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3]\n         , a[0]*b[1] + a[1]*b[0] + a[2]*b[3] - a[3]*b[2]\n         , a[0]*b[2] + a[2]*b[0] + a[3]*b[1] - a[1]*b[3]\n         , a[0]*b[3] + a[3]*b[0] + a[1]*b[2] - a[2]*b[1] ];\n}\n\nfunction qmatrix(q) {\n  return [  [1 - 2*q[2]*q[2] - 2*q[3]*q[3],\t2*q[1]*q[2] - 2*q[3]*q[0],\t    2*q[1]*q[3] + 2*q[2]*q[0]],\n            [2*q[1]*q[2] + 2*q[3]*q[0],\t    1 - 2*q[1]*q[1] - 2*q[3]*q[3],\t2*q[2]*q[3] - 2*q[1]*q[0]],\n            [2*q[1]*q[3] - 2*q[2]*q[0],\t    2*q[2]*q[3] + 2*q[1]*q[0],\t    1 - 2*q[1]*q[1] - 2*q[2]*q[2]] ];\n}\n\nfunction qcross(a, b) {\n  //Normalize a and b\n  var la = 0.0;\n  var lb = 0.0;\n  for(var i=0; i<3; ++i) {\n    la += a[i] * a[i];\n    lb += b[i] * b[i];\n  }\n  if(la > EPSILON) {\n    la = 1.0 / Math.sqrt(la);\n  }\n  if(lb > EPSILON) {\n    lb = 1.0 / Math.sqrt(lb);\n  }\n  var na = new Array(3);\n  var nb = new Array(3);\n  for(var i=0; i<3; ++i) {\n    na[i] = a[i] * la;\n    nb[i] = b[i] * lb;\n  }\n  \n  //Compute quaternion cross of a and b\n  var r = new Array(4);\n  var s = 0.0;\n  for(var i=0; i<3; ++i) {\n    var u = (i+1)%3;\n    var v = (i+2)%3;\n    r[i+1] = na[u]*nb[v] - na[v]*nb[u];\n    s += Math.pow(r[i+1], 2);\n  }\n  r[0] = Math.sqrt(1.0 - s);\n  return r;\n}\n\n\nfunction qnormalize(q) {\n  var s = 0.0;\n  for(var i=0; i<4; ++i) {\n    s += q[i] * q[i];\n  }\n  if(s < EPSILON) {\n    return [1.0, 0.0, 0.0, 0.0];\n  }\n  s = 1.0 / Math.sqrt(s);\n  var r = new Array(4);\n  for(var i=0; i<4; ++i) {\n    r[i] = q[i] * s;\n  }\n  return r;\n}\n\n\n//Assumes z-direction is view axis\nfunction ArcballCamera() {\n  this.rotation     = [1.0, 0.0, 0.0, 0.0];\n  this.translation  = [0.0, 0.0, 0.0];\n  this.zoom_factor  = 0.0;\n  \n  this.z_plane      = 0.5;\n  this.pan_speed    = 20.0;\n  this.zoom_speed   = 1.0;\n  \n  this.last_x       = 0.0;\n  this.last_y       = 0.0;\n}\n\n//Call this whenever the mouse moves\nArcballCamera.prototype.update = function(mx, my, flags) {\n  if(flags.rotate) {\n    var v0 = [this.last_x, -this.last_y, this.z_plane];\n    var v1 = [mx, -my, this.z_plane];\n    this.rotation = qnormalize(qmult(qcross(v0, v1), this.rotation));\n  }\n  if(flags.pan || flags.zoom) {\n    var rmatrix = qmatrix(this.rotation);\n    \n    var dx = mx - this.last_x;\n    var dy = this.last_y - my;\n    \n    var pan_speed  = flags.pan  ? this.pan_speed  : 0.0; \n    var zoom_speed = flags.zoom ? this.zoom_speed : 0.0;\n    \n    for(var i=0; i<3; ++i) {\n      this.translation[i] += pan_speed * (dx * rmatrix[0][i] + dy * rmatrix[1][i]);\n    }\n    \n    this.zoom_factor += zoom_speed * dy;\n  }\n  this.last_x = mx;\n  this.last_y = my;\n}\n\n\n//Returns the camera matrix\nArcballCamera.prototype.matrix = function() {\n  var rmatrix = qmatrix(this.rotation);\n  var result = new Array(4);\n  var scale = Math.exp(this.zoom_factor);\n  for(var i=0; i<4; ++i) {\n    if(i < 3) {\n      result[i] = new Array(4);\n      result[i][3] = 0.0;\n      for(var j=0; j<3; ++j) {\n        result[i][j] = rmatrix[i][j] * scale;\n        result[i][3] += rmatrix[i][j] * this.translation[j] * scale;\n      }\n    } else {\n      result[i] = [0.0, 0.0, 0.0, 1.0];\n    }\n  }\n  return result;\n}\n\nexports.ArcballCamera = ArcballCamera;\n\n});\n\nrequire.define(\"/shapes.js\",function(require,module,exports,__dirname,__filename,process,global){var meshdata = require('meshdata');\nvar trimesh = require('trimesh');\n\nfunction createMoebius(u_res, v_res) {\n  var faces     = [];\n  var vertices  = [];\n  var stripes   = [];\n\n  for(var j=0; j<u_res; ++j) {\n    var stripe = [];\n    var u = (2.0 * Math.PI * j) / u_res;\n    for(var i=-v_res; i<=v_res; ++i) {\n      stripe.push(vertices.length);\n      var v = i / v_res;\n      var a = 10.0*(1.0 + 0.5 * v * Math.cos(0.5 * u));\n      var b = 10.0*(0.5 * v * Math.sin(0.5 * u));\n      vertices.push([a * Math.cos(u), a * Math.sin(u), b]);\n    }\n    \n    stripes.push(stripe);\n    \n    if(j > 0) {\n      var s0 = stripes[stripes.length-2];\n      var s1 = stripe;\n      for(var i=1; i<stripe.length; ++i) {\n        faces.push([ s0[i-1], s1[i-1], s0[i] ]);\n        faces.push([ s1[i-1], s1[i], s0[i] ]);\n      }\n    }\n  }\n  \n  s0 = stripes[stripes.length-1];\n  s1 = stripes[0];\n  s1.reverse();\n  for(var i=1; i<stripe.length; ++i) {\n    faces.push([ s0[i-1], s1[i-1], s0[i] ]);\n    faces.push([ s1[i-1], s1[i], s0[i] ]);\n  }\n  \n  \n  return {faces: faces, positions:vertices};\n}\n\nfunction createSphere(res) {\n  return trimesh.surface_nets({\n    resolution: res,\n    potential: function(x,y,z) {\n      return x*x+y*y+z*z-100;\n    },\n    bounds:[[-12,-12,-12],[12,12,12]]\n  });\n}\n\nfunction createTorus(u_res, v_res) {\n  var faces     = [];\n  var vertices  = [];\n  var stripes   = [];\n\n  for(var j=0; j<u_res; ++j) {\n    var stripe = [];\n    var u = (2.0 * Math.PI * j) / u_res;\n    for(var i=0; i<v_res; ++i) {\n      stripe.push(vertices.length);\n      var v = (2.0 * Math.PI * (i + 0.5 * (j&1))) / v_res;\n      var a = 10.0 + 5.0 * Math.cos(v);\n      var b = 5.0 * Math.sin(v);\n      vertices.push([a * Math.cos(u), a * Math.sin(u), b  ]);\n    }\n    \n    stripes.push(stripe);\n  }\n  \n  for(var i=0; i<stripes.length; ++i) {\n    var s0 = stripes[i];\n    var s1 = stripes[(i+1)%stripes.length];\n    var s2 = stripes[(i+2)%stripes.length];\n    \n    for(var j=0; j<s1.length; ++j) {\n      var d = (i&1) ? v_res-1 : 1;\n      faces.push([s0[j], s1[j], s2[j]]);\n      faces.push([s0[(j+d)%v_res], s1[j], s2[(j+d)%v_res]]);\n    }\n  }\n  return {faces: faces, positions:vertices};\n};\n\n\nfunction createKlein(u_res, v_res) {\n  var faces     = [];\n  var vertices  = [];\n  var stripes   = [];\n\n  for(var j=0; j<u_res; ++j) {\n    var stripe = [];\n    var u = (2.0 * Math.PI * j) / u_res;\n    for(var i=0; i<v_res; ++i) {\n      stripe.push(vertices.length);\n      var v = (2.0 * Math.PI * (i + 0.5 * (j&1))) / v_res;\n      \n      var r = 4.0 * (1.0 - 0.5 * Math.cos(u));\n      var x, y;\n      \n      if(u < Math.PI) {\n        x = 6 * Math.cos(u)*(1+Math.sin(u)) + r*Math.cos(u)*Math.cos(v);\n        y = 16* Math.sin(u) + r*Math.sin(u)*Math.cos(v);\n      } else {\n        x = 6*Math.cos(u)*(1+Math.sin(u)) + r*Math.cos(v+Math.PI);\n        y = 16 * Math.sin(u);\n      }\n      z = r * Math.sin(v);\n      vertices.push([x, y, z]);\n    }\n    \n    stripes.push(stripe);\n  }\n  \n  for(var i=0; i+2<stripes.length; ++i) {\n    var s0 = stripes[i];\n    var s1 = stripes[(i+1)%stripes.length];\n    var s2 = stripes[(i+2)%stripes.length];\n    var dl = (i&1) ? v_res-1 : 1;\n    var dr = dl;\n    \n    for(var j=0; j<s1.length; ++j) {\n      faces.push([s0[j], s1[j], s2[j]]);\n      faces.push([s0[(j+dl)%v_res], s1[j], s2[(j+dr)%v_res]]);\n    }\n  }\n  \n  //FIXME: Need to connect across twist...\n  \n  return {faces: faces, positions:vertices};\n};\n\n\n\nexports.meshSet = {\n  \"Sphere\": createSphere([32,32,32]),\n  \"Torus\":  createTorus(300, 75),\n  \"Möbius\": createMoebius(150,30),\n  \"Bunny\": meshdata.bunny,\n  \"Cube\": trimesh.cube_mesh(10, [20,20,20]),\n  \"Grid\": trimesh.grid_mesh(10, 10)\n};\n\n});\n\nrequire.define(\"/node_modules/meshdata/package.json\",function(require,module,exports,__dirname,__filename,process,global){module.exports = {\"main\":\"index.js\"}\n});\n\nrequire.define(\"/node_modules/meshdata/index.js\",function(require,module,exports,__dirname,__filename,process,global){exports.bunny = require('./models/bunny.js');\nexports.teapot = require('./models/teapot.js');\n\n});\n\nrequire.define(\"/node_modules/meshdata/models/bunny.js\",function(require,module,exports,__dirname,__filename,process,global){exports.positions=[[1.301895,0.122622,2.550061],[1.045326,0.139058,2.835156],[0.569251,0.155925,2.805125],[0.251886,0.144145,2.82928],[0.063033,0.131726,3.01408],[-0.277753,0.135892,3.10716],[-0.441048,0.277064,2.594331],[-1.010956,0.095285,2.668983],[-1.317639,0.069897,2.325448],[-0.751691,0.264681,2.381496],[0.684137,0.31134,2.364574],[1.347931,0.302882,2.201434],[-1.736903,0.029894,1.724111],[-1.319986,0.11998,0.912925],[1.538077,0.157372,0.481711],[1.951975,0.081742,1.1641],[1.834768,0.095832,1.602682],[2.446122,0.091817,1.37558],[2.617615,0.078644,0.742801],[-1.609748,0.04973,-0.238721],[-1.281973,0.230984,-0.180916],[-1.074501,0.248204,0.034007],[-1.201734,0.058499,0.402234],[-1.444454,0.054783,0.149579],[-4.694605,5.075882,1.043427],[-3.95963,7.767394,0.758447],[-4.753339,5.339817,0.665061],[-1.150325,9.133327,-0.368552],[-4.316107,2.893611,0.44399],[-0.809202,9.312575,-0.466061],[0.085626,5.963693,1.685666],[-1.314853,9.00142,-0.1339],[-4.364182,3.072556,1.436712],[-2.022074,7.323396,0.678657],[1.990887,6.13023,0.479643],[-3.295525,7.878917,1.409353],[0.571308,6.197569,0.670657],[0.89661,6.20018,0.337056],[0.331851,6.162372,1.186371],[-4.840066,5.599874,2.296069],[2.138989,6.031291,0.228335],[0.678923,6.026173,1.894052],[-0.781682,5.601573,1.836738],[1.181315,6.239007,0.393293],[-3.606308,7.376476,2.661452],[-0.579059,4.042511,-1.540883],[-3.064069,8.630253,-2.597539],[-2.157271,6.837012,0.300191],[-2.966013,7.821581,-1.13697],[-2.34426,8.122965,0.409043],[-0.951684,5.874251,1.415119],[-2.834853,7.748319,0.182406],[-3.242493,7.820096,0.373674],[-0.208532,5.992846,1.252084],[-3.048085,8.431527,-2.129795],[1.413245,5.806324,2.243906],[-0.051222,6.064901,0.696093],[-4.204306,2.700062,0.713875],[-4.610997,6.343405,0.344272],[-3.291336,9.30531,-3.340445],[-3.27211,7.559239,-2.324016],[-4.23882,6.498344,3.18452],[-3.945317,6.377804,3.38625],[-4.906378,5.472265,1.315193],[-3.580131,7.846717,0.709666],[-1.995504,6.645459,0.688487],[-2.595651,7.86054,0.793351],[-0.008849,0.305871,0.184484],[-0.029011,0.314116,-0.257312],[-2.522424,7.565392,1.804212],[-1.022993,8.650826,-0.855609],[-3.831265,6.595426,3.266783],[-4.042525,6.855724,3.060663],[-4.17126,7.404742,2.391387],[3.904526,3.767693,0.092179],[0.268076,6.086802,1.469223],[-3.320456,8.753222,-2.08969],[1.203048,6.26925,0.612407],[-4.406479,2.985974,0.853691],[-3.226889,6.615215,-0.404243],[0.346326,1.60211,3.509858],[-3.955476,7.253323,2.722392],[-1.23204,0.068935,1.68794],[0.625436,6.196455,1.333156],[4.469132,2.165298,1.70525],[0.950053,6.262899,0.922441],[-2.980404,5.25474,-0.663155],[-4.859043,6.28741,1.537081],[-3.077453,4.641475,-0.892167],[-0.44002,8.222503,-0.771454],[-4.034112,7.639786,0.389935],[-3.696045,6.242042,3.394679],[-1.221806,7.783617,0.196451],[0.71461,6.149895,1.656636],[-4.713539,6.163154,0.495369],[-1.509869,0.913044,-0.832413],[-1.547249,2.066753,-0.852669],[-3.757734,5.793742,3.455794],[-0.831911,0.199296,1.718536],[-3.062763,7.52718,-1.550559],[0.938688,6.103354,1.820958],[-4.037033,2.412311,0.988026],[-4.130746,2.571806,1.101689],[-0.693664,9.174283,-0.952323],[-1.286742,1.079679,-0.751219],[1.543185,1.408925,3.483132],[1.535973,2.047979,3.655029],[0.93844,5.84101,2.195219],[-0.684401,5.918492,1.20109],[1.28844,2.008676,3.710781],[-3.586722,7.435506,-1.454737],[-0.129975,4.384192,2.930593],[-1.030531,0.281374,3.214273],[-3.058751,8.137238,-3.227714],[3.649524,4.592226,1.340021],[-3.354828,7.322425,-1.412086],[0.936449,6.209237,1.512693],[-1.001832,3.590411,-1.545892],[-3.770486,4.593242,2.477056],[-0.971925,0.067797,0.921384],[-4.639832,6.865407,2.311791],[-0.441014,8.093595,-0.595999],[-2.004852,6.37142,1.635383],[4.759591,1.92818,0.328328],[3.748064,1.224074,2.140484],[-0.703601,5.285476,2.251988],[0.59532,6.21893,0.981004],[0.980799,6.257026,1.24223],[1.574697,6.204981,0.381628],[1.149594,6.173608,1.660763],[-3.501963,5.895989,3.456576],[1.071122,5.424198,2.588717],[-0.774693,8.473335,-0.276957],[3.849959,4.15542,0.396742],[-0.801715,4.973149,-1.068582],[-2.927676,0.625112,2.326393],[2.669682,4.045542,2.971184],[-4.391324,4.74086,0.343463],[1.520129,6.270031,0.775471],[1.837586,6.084731,0.109188],[1.271475,5.975024,2.032355],[-3.487968,4.513249,2.605871],[-1.32234,1.517264,-0.691879],[-1.080301,1.648226,-0.805526],[-3.365703,6.910166,-0.454902],[1.36034,0.432238,3.075004],[-3.305013,5.774685,3.39142],[3.88432,0.654141,0.12574],[3.57254,0.377934,0.302501],[4.196136,0.807999,0.212229],[3.932997,0.543123,0.380579],[4.023704,3.286125,0.537597],[1.864455,4.916544,2.691677],[-4.775427,6.499498,1.440153],[-3.464928,3.68234,2.766356],[3.648972,1.751262,2.157485],[1.179111,3.238846,3.774796],[-0.171164,0.299126,-0.592669],[-4.502912,3.316656,0.875188],[-0.948454,9.214025,-0.679508],[1.237665,6.288593,1.046],[1.523423,6.268963,1.139544],[1.436519,6.140608,1.739316],[3.723607,1.504355,2.136762],[2.009495,4.045514,3.22053],[-1.921944,7.249905,0.213973],[1.254068,1.205518,3.474709],[-0.317087,5.996269,0.525872],[-2.996914,3.934607,2.900178],[-3.316873,4.028154,2.785696],[-3.400267,4.280157,2.689268],[-3.134842,4.564875,2.697192],[1.480563,4.692567,2.834068],[0.873682,1.315452,3.541585],[1.599355,0.91622,3.246769],[-3.292102,7.125914,2.768515],[3.74296,4.511299,0.616539],[4.698935,1.55336,0.26921],[-3.274387,3.299421,2.823946],[-2.88809,3.410699,2.955248],[1.171407,1.76905,3.688472],[1.430276,3.92483,3.473666],[3.916941,2.553308,0.018941],[0.701632,2.442372,3.778639],[1.562657,2.302778,3.660957],[4.476622,1.152407,0.182131],[-0.61136,5.761367,1.598838],[-3.102154,3.691687,2.903738],[1.816012,5.546167,2.380308],[3.853928,4.25066,0.750017],[1.234681,3.581665,3.673723],[1.862271,1.361863,3.355209],[1.346844,4.146995,3.327877],[1.70672,4.080043,3.274307],[0.897242,1.908983,3.6969],[-0.587022,9.191132,-0.565301],[-0.217426,5.674606,2.019968],[0.278925,6.120777,0.485403],[1.463328,3.578742,-2.001464],[-3.072985,4.264581,2.789502],[3.62353,4.673843,0.383452],[-3.053491,8.752377,-2.908434],[-2.628687,4.505072,2.755601],[0.891047,5.113781,2.748272],[-2.923732,3.06515,2.866368],[0.848008,4.754252,2.896972],[-3.319184,8.811641,-2.327412],[0.12864,8.814781,-1.334456],[1.549501,4.549331,-1.28243],[1.647161,3.738973,3.507719],[1.250888,0.945599,3.348739],[3.809662,4.038822,0.053142],[1.483166,0.673327,3.09156],[0.829726,3.635921,3.713103],[1.352914,5.226651,2.668113],[2.237352,4.37414,3.016386],[4.507929,0.889447,0.744249],[4.57304,1.010981,0.496588],[3.931422,1.720989,2.088175],[-0.463177,5.989835,0.834346],[-2.811236,3.745023,2.969587],[-2.805135,4.219721,2.841108],[-2.836842,4.802543,2.60826],[1.776716,2.084611,3.568638],[4.046881,1.463478,2.106273],[0.316265,5.944313,1.892785],[-2.86347,2.776049,2.77242],[-2.673644,3.116508,2.907104],[-2.621149,4.018502,2.903409],[-2.573447,5.198013,2.477481],[1.104039,2.278985,3.722469],[-4.602743,4.306413,0.902296],[-2.684878,1.510731,0.535039],[0.092036,8.473269,-0.99413],[-1.280472,5.602393,1.928105],[-1.0279,4.121582,-1.403103],[-2.461081,3.304477,2.957317],[-2.375929,3.659383,2.953233],[1.417579,2.715389,3.718767],[0.819727,2.948823,3.810639],[1.329962,0.761779,3.203724],[1.73952,5.295229,2.537725],[0.952523,3.945016,3.548229],[-2.569498,0.633669,2.84818],[-2.276676,0.757013,2.780717],[-2.013147,7.354429,-0.003202],[0.93143,1.565913,3.600325],[1.249014,1.550556,3.585842],[2.287252,4.072353,3.124544],[-4.7349,7.006244,1.690653],[-3.500602,8.80386,-2.009196],[-0.582629,5.549138,2.000923],[-1.865297,6.356066,1.313593],[-3.212154,2.376143,-0.565593],[2.092889,3.493536,-1.727931],[-2.528501,2.784531,2.833758],[-2.565697,4.893154,2.559605],[-2.153366,5.04584,2.465215],[1.631311,2.568241,3.681445],[2.150193,4.699227,2.807505],[0.507599,5.01813,2.775892],[4.129862,1.863698,2.015101],[3.578279,4.50766,-0.009598],[3.491023,4.806749,1.549265],[0.619485,1.625336,3.605125],[1.107499,2.932557,3.790061],[-2.082292,6.99321,0.742601],[4.839909,1.379279,0.945274],[3.591328,4.322645,-0.259497],[1.055245,0.710686,3.16553],[-3.026494,7.842227,1.624553],[0.146569,6.119214,0.981673],[-2.043687,2.614509,2.785526],[-2.302242,3.047775,2.936355],[-2.245686,4.100424,2.87794],[2.116148,5.063507,2.572204],[-1.448406,7.64559,0.251692],[2.550717,4.9268,2.517526],[-2.955456,7.80293,-1.782407],[1.882995,4.637167,2.895436],[-2.014924,3.398262,2.954896],[-2.273654,4.771227,2.611418],[-2.162723,7.876761,0.702473],[-0.198659,5.823062,1.739272],[-1.280908,2.133189,-0.921241],[2.039932,4.251568,3.136579],[1.477815,4.354333,3.108325],[0.560504,3.744128,3.6913],[-2.234018,1.054373,2.352782],[-3.189156,7.686661,-2.514955],[-3.744736,7.69963,2.116973],[-2.283366,2.878365,2.87882],[-2.153786,4.457481,2.743529],[4.933978,1.677287,0.713773],[3.502146,0.535336,1.752511],[1.825169,4.419253,3.081198],[3.072331,0.280979,0.106534],[-0.508381,1.220392,2.878049],[-3.138824,8.445394,-1.659711],[-2.056425,2.954815,2.897241],[-2.035343,5.398477,2.215842],[-3.239915,7.126798,-0.712547],[-1.867923,7.989805,0.526518],[1.23405,6.248973,1.387189],[-0.216492,8.320933,-0.862495],[-2.079659,3.755709,2.928563],[-1.78595,4.300374,2.805295],[-1.856589,5.10678,2.386572],[-1.714362,5.544778,2.004623],[1.722403,4.200291,-1.408161],[0.195386,0.086928,-1.318006],[1.393693,3.013404,3.710686],[-0.415307,8.508471,-0.996883],[-1.853777,0.755635,2.757275],[-1.724057,3.64533,2.884251],[-1.884511,4.927802,2.530885],[-1.017174,7.783908,-0.227078],[-1.7798,2.342513,2.741749],[-1.841329,3.943996,2.88436],[1.430388,5.468067,2.503467],[-2.030296,0.940028,2.611088],[-1.677028,1.215666,2.607771],[-1.74092,2.832564,2.827295],[4.144673,0.631374,0.503358],[4.238811,0.653992,0.762436],[-1.847016,2.082815,2.642674],[4.045764,3.194073,0.852117],[-1.563989,8.112739,0.303102],[-1.781627,1.794836,2.602338],[-1.493749,2.533799,2.797251],[-1.934496,4.690689,2.658999],[-1.499174,5.777946,1.747498],[-2.387409,0.851291,1.500524],[-1.872211,8.269987,0.392533],[-4.647726,6.765771,0.833653],[-3.157482,0.341958,-0.20671],[-1.725766,3.24703,2.883579],[-1.458199,4.079031,2.836325],[-1.621548,4.515869,2.719266],[-1.607292,4.918914,2.505881],[-1.494661,5.556239,1.991599],[-1.727269,7.423769,0.012337],[-1.382497,1.161322,2.640222],[-1.52129,4.681714,2.615467],[-4.247127,2.792812,1.250843],[-1.576338,0.742947,2.769799],[-1.499257,2.172763,2.743142],[-1.480392,3.103261,2.862262],[1.049137,2.625836,3.775384],[-1.368063,1.791587,2.695516],[-1.307839,2.344534,2.767575],[-1.336758,5.092221,2.355225],[-1.5617,5.301749,2.21625],[-1.483362,8.537704,0.196752],[-1.517348,8.773614,0.074053],[-1.474302,1.492731,2.641433],[2.48718,0.644247,-0.920226],[0.818091,0.422682,3.171218],[-3.623398,6.930094,3.033045],[1.676333,3.531039,3.591591],[1.199939,5.683873,2.365623],[-1.223851,8.841201,0.025414],[-1.286307,3.847643,2.918044],[-1.25857,4.810831,2.543605],[2.603662,5.572146,1.991854],[0.138984,5.779724,2.077834],[-1.267039,3.175169,2.890889],[-1.293616,3.454612,2.911774],[-2.60112,1.277184,0.07724],[2.552779,3.649877,3.163643],[-1.038983,1.248011,2.605933],[-1.288709,4.390967,2.761214],[-1.034218,5.485963,2.011467],[-1.185576,1.464842,2.624335],[-1.045682,2.54896,2.761102],[4.259176,1.660627,2.018096],[-0.961707,1.717183,2.598342],[-1.044603,3.147464,2.855335],[-0.891998,4.685429,2.669696],[-1.027561,5.081672,2.377939],[4.386506,0.832434,0.510074],[-1.014225,9.064991,-0.175352],[-1.218752,2.895443,2.823785],[-0.972075,4.432669,2.788005],[-2.714986,0.52425,1.509798],[-0.699248,1.517219,2.645738],[-1.161581,2.078852,2.722795],[-0.845249,3.286247,2.996471],[1.068329,4.443444,2.993863],[3.98132,3.715557,1.027775],[1.658097,3.982428,-1.651688],[-4.053701,2.449888,0.734746],[-0.910935,2.214149,2.702393],[0.087824,3.96165,3.439344],[-0.779714,3.724134,2.993429],[-1.051093,3.810797,2.941957],[-0.644941,4.3859,2.870863],[-2.98403,8.666895,-3.691888],[-0.754304,2.508325,2.812999],[-4.635524,3.662891,0.913005],[-0.983299,4.125978,2.915378],[4.916497,1.905209,0.621315],[4.874983,1.728429,0.468521],[2.33127,5.181957,2.441697],[-0.653711,2.253387,2.7949],[-3.623744,8.978795,-2.46192],[-4.555927,6.160279,0.215755],[-4.940628,5.806712,1.18383],[3.308506,2.40326,-0.910776],[0.58835,5.251928,-0.992886],[2.152215,5.449733,2.331679],[-0.712755,0.766765,3.280375],[-0.741771,1.9716,2.657235],[-4.828957,5.566946,2.635623],[-3.474788,8.696771,-1.776121],[1.770417,6.205561,1.331627],[-0.620626,4.064721,2.968972],[-1.499187,2.307735,-0.978901],[4.098793,2.330245,1.667951],[1.940444,6.167057,0.935904],[-2.314436,1.104995,1.681277],[-2.733629,7.742793,1.7705],[-0.452248,4.719868,2.740834],[-0.649143,4.951713,2.541296],[-0.479417,9.43959,-0.676324],[-2.251853,6.559275,0.046819],[0.033531,8.316907,-0.789939],[-0.513125,0.995673,3.125462],[-2.637602,1.039747,0.602434],[1.527513,6.230089,1.430903],[4.036124,2.609846,1.506498],[-3.559828,7.877892,1.228076],[-4.570736,4.960193,0.838201],[-0.432121,5.157731,2.467518],[-1.206735,4.562511,-1.237054],[-0.823768,3.788746,-1.567481],[-3.095544,7.353613,-1.024577],[-4.056088,7.631119,2.062001],[-0.289385,5.382261,2.329421],[1.69752,6.136483,1.667037],[-0.168758,5.061138,2.617453],[2.853576,1.605528,-1.229958],[-4.514319,6.586675,0.352756],[-2.558081,7.741151,1.29295],[1.61116,5.92358,2.071534],[3.936921,3.354857,0.091755],[-0.1633,1.119272,3.147975],[0.067551,1.593475,3.38212],[-1.303239,2.328184,-1.011672],[-0.438093,0.73423,3.398384],[-4.62767,3.898187,0.849573],[0.286853,4.165281,3.284834],[-2.968052,8.492812,-3.493693],[-0.111896,3.696111,3.53791],[-3.808245,8.451731,-1.574742],[0.053416,5.558764,2.31107],[3.956269,3.012071,0.11121],[-0.710956,8.106561,-0.665154],[0.234725,2.717326,3.722379],[-0.031594,2.76411,3.657347],[-0.017371,4.700633,2.81911],[0.215064,5.034859,2.721426],[-0.111151,8.480333,-0.649399],[3.97942,3.575478,0.362219],[0.392962,4.735392,2.874321],[4.17015,2.085087,1.865999],[0.169054,1.244786,3.337709],[0.020049,3.165818,3.721736],[0.248212,3.595518,3.698376],[0.130706,5.295541,2.540034],[-4.541357,4.798332,1.026866],[-1.277485,1.289518,-0.667272],[3.892133,3.54263,-0.078056],[4.057379,3.03669,0.997913],[0.287719,0.884758,3.251787],[0.535771,1.144701,3.400096],[0.585303,1.399362,3.505353],[0.191551,2.076246,3.549355],[0.328656,2.394576,3.649623],[0.413124,3.240728,3.771515],[0.630361,4.501549,2.963623],[0.529441,5.854392,2.120225],[3.805796,3.769958,-0.162079],[3.447279,4.344846,-0.467276],[0.377618,5.551116,2.426017],[0.409355,1.821269,3.606333],[0.719959,2.194726,3.703851],[0.495922,3.501519,3.755661],[0.603408,5.354097,2.603088],[-4.605056,7.531978,1.19579],[0.907972,0.973128,3.356513],[0.750134,3.356137,3.765847],[0.4496,3.993244,3.504544],[-3.030738,7.48947,-1.259169],[0.707505,5.602005,2.43476],[0.668944,0.654891,3.213797],[0.593244,2.700978,3.791427],[1.467759,3.30327,3.71035],[3.316249,2.436388,2.581175],[3.26138,1.724425,2.539028],[-1.231292,7.968263,0.281414],[-0.108773,8.712307,-0.790607],[4.445684,1.819442,1.896988],[1.998959,2.281499,3.49447],[2.162269,2.113817,3.365449],[4.363397,1.406731,1.922714],[4.808,2.225842,0.611127],[2.735919,0.771812,-0.701142],[1.897735,2.878428,3.583482],[-3.31616,5.331985,3.212394],[-3.3314,6.018137,3.313018],[-3.503183,6.480103,3.222216],[-1.904453,5.750392,1.913324],[-1.339735,3.559592,-1.421817],[-1.044242,8.22539,0.037414],[1.643492,3.110676,3.647424],[3.992832,3.686244,0.710946],[1.774207,1.71842,3.475768],[-3.438842,5.5713,3.427818],[4.602447,1.2583,1.619528],[-0.925516,7.930042,0.072336],[-1.252093,3.846565,-1.420761],[-3.426857,5.072419,2.97806],[-3.160408,6.152629,3.061869],[3.739931,3.367082,2.041273],[1.027419,4.235891,3.251253],[4.777703,1.887452,1.560409],[-3.318528,6.733796,2.982968],[2.929265,4.962579,2.271079],[3.449761,2.838629,2.474576],[-3.280159,5.029875,2.787514],[4.068939,2.993629,0.741567],[0.303312,8.70927,-1.121972],[0.229852,8.981322,-1.186075],[-0.011045,9.148156,-1.047057],[-2.942683,5.579613,2.929297],[-3.145409,5.698727,3.205778],[-3.019089,6.30887,2.794323],[-3.217135,6.468191,2.970032],[-3.048298,6.993641,2.623378],[-3.07429,6.660982,2.702434],[3.612011,2.5574,2.25349],[2.54516,4.553967,2.75884],[-1.683759,7.400787,0.250868],[-1.756066,7.463557,0.448031],[-3.023761,5.149697,2.673539],[3.112376,2.677218,2.782378],[2.835327,4.581196,2.567146],[-2.973799,7.225458,2.506988],[-0.591645,8.740662,-0.505845],[3.782861,2.04337,2.03066],[3.331604,3.36343,2.605047],[2.966866,1.205497,2.537432],[0.002669,9.654748,-1.355559],[2.632801,0.58497,2.540311],[-2.819398,5.087372,2.521098],[2.616193,5.332961,2.194288],[-3.193973,4.925634,2.607924],[-3.12618,5.27524,2.944544],[-0.426003,8.516354,-0.501528],[2.802717,1.387643,2.751649],[-3.120597,7.889111,-2.75431],[2.636648,1.71702,2.991302],[-2.853151,6.711792,2.430276],[-2.843836,6.962865,2.400842],[1.9696,3.199023,3.504514],[-2.461751,0.386352,3.008994],[1.64127,0.495758,3.02958],[-4.330472,5.409831,0.025287],[-2.912387,5.980416,2.844261],[-2.490069,0.211078,2.985391],[3.581816,4.809118,0.733728],[2.693199,2.647213,3.126709],[-0.182964,8.184108,-0.638459],[-2.226855,0.444711,2.946552],[-0.720175,8.115055,0.017689],[2.645302,4.316212,2.850139],[-0.232764,9.329503,-0.918639],[4.852365,1.471901,0.65275],[2.76229,2.014994,2.957755],[-2.808374,5.354301,2.644695],[-2.790967,6.406963,2.547985],[-1.342684,0.418488,-1.669183],[2.690675,5.593587,-0.041236],[4.660146,1.6318,1.713314],[2.775667,3.007229,3.111332],[-0.396696,8.963432,-0.706202],[2.446707,2.740617,3.321433],[-4.803209,5.884634,2.603672],[-2.652003,1.6541,1.5078],[3.932327,3.972874,0.831924],[2.135906,0.955587,2.986608],[2.486131,2.053802,3.124115],[-0.386706,8.115753,-0.37565],[-2.720727,7.325044,2.224878],[-1.396946,7.638016,-0.16486],[-0.62083,7.989771,-0.144413],[-2.653272,5.729684,2.667679],[3.038188,4.65835,2.364142],[2.381721,0.739472,2.788992],[-2.345829,5.474929,2.380633],[-2.518983,6.080562,2.479383],[-2.615793,6.839622,2.186116],[-2.286566,0.143752,2.766848],[-4.771219,6.508766,1.070797],[3.717308,2.905019,2.097994],[2.50521,3.016743,3.295898],[2.208448,1.56029,3.216806],[3.346783,1.01254,2.119951],[2.653503,3.26122,3.175738],[-2.359636,5.827519,2.402297],[-1.952693,0.558102,2.853307],[-0.321562,9.414885,-1.187501],[3.138923,1.405072,2.520765],[1.493728,1.780051,3.621969],[3.01817,0.907291,2.336909],[3.183548,1.185297,2.352175],[1.608619,5.006753,2.695131],[-4.723919,6.836107,1.095288],[-1.017586,8.865429,-0.149328],[4.730762,1.214014,0.64008],[-2.135182,6.647907,1.495471],[-2.420382,6.546114,2.108209],[-2.458053,7.186346,1.896623],[3.437124,0.275798,1.138203],[0.095925,8.725832,-0.926481],[2.417376,2.429869,3.287659],[2.279951,1.200317,3.049994],[2.674753,2.326926,3.044059],[-2.328123,6.849164,1.75751],[-3.418616,7.853407,0.126248],[-3.151587,7.77543,-0.110889],[2.349144,5.653242,2.05869],[-2.273236,6.085631,2.242888],[-4.560601,4.525342,1.261241],[2.866334,3.796067,2.934717],[-2.17493,6.505518,1.791367],[3.12059,3.283157,2.818869],[3.037703,3.562356,2.866653],[0.066233,9.488418,-1.248237],[2.749941,0.975018,2.573371],[-2.155749,5.801033,2.204009],[-2.162778,6.261889,2.028596],[1.936874,0.459142,2.956718],[3.176249,4.335541,2.440447],[4.356599,1.029423,1.700589],[3.873502,3.082678,1.80431],[2.895489,4.243034,2.735259],[-0.095774,9.468195,-1.07451],[-1.124982,7.886808,-0.480851],[3.032304,3.065454,2.897927],[3.692687,4.5961,0.957858],[-3.013045,3.807235,-1.098381],[-0.790012,8.92912,-0.367572],[1.905793,0.73179,2.996728],[3.530396,3.426233,2.356583],[2.12299,0.624933,2.929167],[-2.069196,6.039284,2.01251],[-3.565623,7.182525,2.850039],[2.959264,2.376337,2.829242],[2.949071,1.822483,2.793933],[4.036142,0.763803,1.703744],[-1.993527,6.180318,1.804936],[-0.030987,0.766389,3.344766],[-0.549683,8.225193,-0.189341],[-0.765469,8.272246,-0.127174],[-2.947047,7.541648,-0.414113],[-3.050327,9.10114,-3.435619],[3.488566,2.231807,2.399836],[3.352283,4.727851,1.946438],[4.741011,2.162773,1.499574],[-1.815093,6.072079,1.580722],[-3.720969,8.267927,-0.984713],[1.932826,3.714052,3.427488],[3.323617,4.438961,2.20732],[0.254111,9.26364,-1.373244],[-1.493384,7.868585,-0.450051],[-0.841901,0.776135,-1.619467],[0.243537,6.027668,0.091687],[0.303057,0.313022,-0.531105],[-0.435273,0.474098,3.481552],[2.121507,2.622389,3.486293],[1.96194,1.101753,3.159584],[3.937991,3.407551,1.551392],[0.070906,0.295753,1.377185],[-1.93588,7.631764,0.651674],[-2.523531,0.744818,-0.30985],[2.891496,3.319875,2.983079],[4.781765,1.547061,1.523129],[-2.256064,7.571251,0.973716],[3.244861,3.058249,2.724392],[-0.145855,0.437775,3.433662],[1.586296,5.658538,2.358487],[3.658336,3.774921,2.071837],[2.840463,4.817098,2.46376],[-1.219464,8.122542,-0.672808],[-2.520906,2.664486,-1.034346],[-1.315417,8.471365,-0.709557],[3.429165,3.74686,2.446169],[3.074579,3.840758,2.767409],[3.569443,3.166337,2.333647],[2.294337,3.280051,3.359346],[2.21816,3.66578,3.269222],[2.158662,4.151444,-1.357919],[1.13862,4.380986,-1.404565],[3.388382,2.749931,-0.840949],[3.059892,5.084848,2.026066],[3.204739,2.075145,2.640706],[3.387065,1.42617,2.305275],[3.910398,2.670742,1.750179],[3.471512,1.945821,2.395881],[4.08082,1.070654,1.960171],[-1.057861,0.133036,2.146707],[-0.151749,5.53551,-0.624323],[3.233099,4.003778,2.571172],[2.611726,5.319199,-0.499388],[2.682909,1.094499,-1.206247],[-1.22823,7.656887,0.041409],[-2.293247,7.259189,0.013844],[0.081315,0.202174,3.286381],[-1.002038,5.794454,-0.187194],[3.448856,4.08091,2.258325],[0.287883,9.006888,-1.550641],[-3.851019,4.059839,-0.646922],[3.610966,4.205438,1.913129],[2.239042,2.950872,3.449959],[0.216305,0.442843,3.328052],[1.87141,2.470745,3.574559],[3.811378,2.768718,-0.228364],[2.511081,1.362724,2.969349],[-1.59813,7.866506,0.440184],[-3.307975,2.851072,-0.894978],[-0.107011,8.90573,-0.884399],[-3.855315,2.842597,-0.434541],[2.517853,1.090768,2.799687],[3.791709,2.36685,2.002703],[4.06294,2.773922,0.452723],[-2.973289,7.61703,-0.623653],[-2.95509,8.924462,-3.446319],[2.861402,0.562592,2.184397],[-1.109725,8.594206,-0.076812],[-0.725722,7.924485,-0.381133],[-1.485587,1.329994,-0.654405],[-4.342113,3.233735,1.752922],[-2.968049,7.955519,-2.09405],[-3.130948,0.446196,0.85287],[-4.958475,5.757329,1.447055],[-3.086547,7.615193,-1.953168],[-3.751923,5.412821,3.373373],[-4.599645,7.480953,1.677134],[1.133992,0.274871,0.032249],[-2.956512,8.126905,-1.785461],[-0.960645,4.73065,-1.191786],[-2.871064,0.875559,0.424881],[-4.932114,5.99614,1.483845],[-2.981761,8.124612,-1.387276],[0.362298,8.978545,-1.368024],[-4.408375,3.046271,0.602373],[2.865841,2.322263,-1.344625],[-4.7848,5.620895,0.594432],[-2.88322,0.338931,1.67231],[-4.688101,6.772931,1.872318],[-4.903948,6.164698,1.27135],[2.85663,1.005647,-0.906843],[2.691286,0.209811,0.050512],[-4.693636,6.477556,0.665796],[-4.472331,6.861067,0.477318],[0.883065,0.204907,3.073933],[-0.995867,8.048729,-0.653897],[-0.794663,5.670397,-0.390119],[3.313153,1.638006,-0.722289],[-4.856459,5.394758,1.032591],[-3.005448,7.783023,-0.819641],[3.11891,2.036974,-1.08689],[-2.364319,2.408419,2.63419],[-2.927132,8.75435,-3.537159],[-3.296222,7.964629,-3.134625],[-1.642041,4.13417,-1.301665],[2.030759,0.176372,-1.030923],[-4.559069,3.751053,0.548453],[3.438385,4.59454,-0.243215],[-2.561769,7.93935,0.177696],[2.990593,1.335314,-0.943177],[1.2808,0.276396,-0.49072],[-0.318889,0.290684,0.211143],[3.54614,3.342635,-0.767878],[-3.073372,7.780018,-2.357807],[-4.455388,4.387245,0.361038],[-4.659393,6.276064,2.767014],[0.636799,4.482223,-1.426284],[-2.987681,8.072969,-2.45245],[-2.610445,0.763554,1.792054],[3.358241,2.006707,-0.802973],[-0.498347,0.251594,0.962885],[3.1322,0.683312,2.038777],[-4.389801,7.493776,0.690247],[0.431467,4.22119,-1.614215],[-4.376181,3.213141,0.273255],[-4.872319,5.715645,0.829714],[-4.826893,6.195334,0.849912],[3.516562,2.23732,-0.677597],[3.131656,1.698841,-0.975761],[-4.754925,5.411666,1.989303],[-2.987299,7.320765,-0.629479],[-3.757635,3.274862,-0.744022],[3.487044,2.541999,-0.699933],[-4.53274,4.649505,0.77093],[-1.424192,0.099423,2.633327],[3.090867,2.476975,-1.146957],[-2.713256,0.815622,2.17311],[3.348121,3.254167,-0.984896],[-3.031379,0.16453,-0.309937],[-0.949757,4.518137,-1.309172],[-0.889509,0.095256,1.288803],[3.539594,1.966105,-0.553965],[-4.60612,7.127749,0.811958],[-2.332953,1.444713,1.624548],[3.136293,2.95805,-1.138272],[3.540808,3.069058,-0.735285],[3.678852,2.362375,-0.452543],[-4.648898,7.37438,0.954791],[-0.646871,0.19037,3.344746],[2.2825,0.29343,-0.826273],[-4.422291,7.183959,0.557517],[-4.694668,5.246103,2.541768],[-4.583691,4.145486,0.600207],[-2.934854,7.912513,-1.539269],[-3.067861,7.817472,-0.546501],[3.825095,3.229512,-0.237547],[2.532494,0.323059,2.387105],[-2.514583,0.692857,1.23597],[-4.736805,7.214384,1.259421],[-2.98071,8.409903,-2.468199],[2.621468,1.385844,-1.406355],[3.811447,3.560855,1.847828],[3.432925,1.497205,-0.489784],[3.746609,3.631538,-0.39067],[3.594909,2.832257,-0.576012],[-0.404192,5.300188,-0.856561],[-4.762996,6.483774,1.702648],[-4.756612,6.786223,1.43682],[-2.965309,8.437217,-2.785495],[2.863867,0.74087,-0.429684],[4.02503,2.968753,1.392419],[3.669036,1.833858,-0.304971],[-2.888864,0.720537,0.778057],[-2.36982,0.979443,1.054447],[-2.959259,8.222303,-2.659724],[-3.467825,7.545739,-2.333445],[2.153426,0.446256,-1.20523],[-3.229807,9.189699,-3.596609],[-3.72486,8.773707,-2.046671],[3.687218,3.297751,-0.523746],[1.381025,0.08815,-1.185668],[-2.796828,7.205622,-0.208783],[3.647194,4.066232,-0.291507],[-4.578376,3.885556,1.52546],[-2.840262,0.63094,1.89499],[-2.429514,0.922118,1.820781],[-4.675079,6.573925,2.423363],[2.806207,4.320188,-1.027372],[-1.289608,0.097241,1.321661],[-3.010731,8.141334,-2.866148],[3.202291,1.235617,-0.549025],[4.094792,2.477519,0.304581],[2.948403,0.966873,-0.664857],[-4.83297,5.920587,2.095461],[-2.169693,7.257277,0.946184],[-1.335807,3.057597,-1.303166],[-1.037877,0.64151,-1.685271],[2.627919,0.089814,0.439074],[3.815794,3.808102,1.730493],[-2.973455,8.433141,-3.08872],[-2.391558,7.331428,1.658264],[-4.333107,4.529978,1.850516],[-4.640293,3.767107,1.168841],[3.600716,4.46931,1.734024],[3.880803,1.730158,-0.172736],[3.814183,4.262372,1.167042],[4.37325,0.829542,1.413729],[2.490447,5.75111,0.011492],[3.460003,4.962436,1.188971],[3.918419,3.814234,1.358271],[-0.807595,8.840504,-0.953711],[3.752855,4.20577,1.57177],[-2.991085,8.816501,-3.244595],[-2.333196,7.128889,1.551985],[3.977718,3.570941,1.25937],[4.360071,0.755579,1.079916],[4.637579,1.027973,1.032567],[-2.317,7.421066,1.329589],[-1.013404,8.293662,-0.7823],[4.548023,1.020644,1.420462],[4.763258,1.266798,1.296203],[4.896,2.073084,1.255213],[4.015005,3.325226,1.093879],[4.94885,1.860936,0.894463],[-2.189645,6.954634,1.270077],[4.887442,1.720992,1.288526],[-3.184068,7.871802,0.956189],[-1.274318,0.839887,-1.224389],[-2.919521,7.84432,0.541629],[-2.994586,7.766102,1.96867],[-3.417504,9.241714,-3.093201],[-3.174563,7.466456,2.473617],[-3.263067,9.069412,-3.003459],[-2.841592,0.529833,2.693434],[-3.611069,9.158804,-2.829871],[-4.642828,5.927526,0.320549],[-3.809308,9.051035,-2.692749],[-2.837582,7.487987,-0.106206],[4.773025,2.330442,1.213899],[4.897435,2.209906,0.966657],[-3.067637,8.164062,-1.12661],[-3.122129,8.08074,-0.899194],[4.571019,2.358113,1.462054],[4.584884,2.454418,0.709466],[-3.661093,7.146581,-0.475948],[4.735131,2.415859,0.933939],[4.207556,2.540018,1.218293],[-3.607595,7.89161,-0.121172],[-1.527952,0.775564,-1.061903],[4.53874,2.503273,1.099583],[-3.938837,7.587988,0.082449],[-4.853582,6.152409,1.787943],[-4.752214,6.247234,2.296873],[4.602935,2.363955,0.488901],[-1.81638,6.365879,0.868272],[0.595467,4.744074,-1.32483],[1.87635,3.511986,-1.842924],[4.330947,2.534326,0.720503],[4.108736,2.750805,0.904552],[-1.890939,8.492628,-0.290768],[-3.504309,6.173058,-0.422804],[-1.611992,6.196732,0.648736],[-3.899149,7.826123,1.088845],[-3.078303,3.008813,-1.035784],[-2.798999,7.844899,1.340061],[-1.248839,5.959105,0.041761],[0.767779,4.337318,3.090817],[-3.831177,7.515605,2.432261],[-1.667528,6.156208,0.365267],[-1.726078,6.237384,1.100059],[-3.972037,4.520832,-0.370756],[-4.40449,7.636357,1.520425],[-1.34506,6.004054,1.293159],[-1.233556,6.049933,0.500651],[-3.696869,7.79732,0.37979],[-3.307798,8.949964,-2.698113],[-1.997295,6.615056,1.103691],[-3.219222,8.336394,-1.150614],[-3.452623,8.31866,-0.9417],[-3.94641,2.990494,2.212592],[-3.250025,8.030414,-0.596097],[-2.02375,1.571333,2.397939],[-3.190358,7.665013,2.268183],[-2.811918,7.618526,2.145587],[-1.005265,5.892303,0.072158],[-0.93721,5.974148,0.906669],[-4.646072,7.492193,1.45312],[-0.252931,1.797654,3.140638],[-1.076064,5.738433,1.695953],[-3.980534,7.744391,1.735791],[-0.721187,5.939396,0.526032],[-0.42818,5.919755,0.229001],[-1.43429,6.11622,0.93863],[-0.985638,5.939683,0.290636],[-4.433836,7.461372,1.966437],[-3.696398,7.844859,1.547325],[-3.390772,7.820186,1.812204],[-2.916787,7.864019,0.804341],[-3.715952,8.037269,-0.591341],[-4.204634,7.72919,1.119866],[-4.592233,5.592883,0.246264],[3.307299,5.061701,1.622917],[-3.515159,7.601467,2.368914],[-3.435742,8.533457,-1.37916],[-0.269421,4.545635,-1.366445],[-2.542124,3.768736,-1.258512],[-3.034003,7.873773,1.256854],[-2.801399,7.856028,1.080137],[3.29354,5.220894,1.081767],[-2.35109,1.299486,1.01206],[-3.232213,7.768136,2.047563],[3.290415,5.217525,0.68019],[-3.415109,7.731034,2.144326],[3.440357,4.962463,0.373387],[3.147346,5.352121,1.386923],[2.847252,5.469051,1.831981],[3.137682,5.410222,1.050188],[3.102694,5.310456,1.676434],[-3.044601,0.39515,1.994084],[2.903647,5.561338,1.518598],[-3.810148,8.093598,-0.889131],[4.234835,0.803054,1.593271],[3.240165,5.228747,0.325955],[3.037452,5.509825,0.817137],[2.635031,5.795187,1.439724],[3.071607,5.318303,0.080142],[2.909167,5.611751,1.155874],[3.044889,5.465928,0.486566],[2.502256,5.770673,1.740054],[-0.067497,0.086416,-1.190239],[2.33326,5.906051,0.138295],[0.65096,4.205423,3.308767],[-2.671137,7.936535,0.432731],[2.14463,5.879214,1.866047],[-4.776469,5.890689,0.561986],[2.72432,5.655145,0.211951],[2.730488,5.751455,0.695894],[2.572682,5.869295,1.152663],[1.906776,5.739123,2.196551],[2.344414,5.999961,0.772922],[-3.377905,7.448708,-1.863251],[2.285149,5.968156,1.459258],[2.385989,5.928974,0.3689],[2.192111,6.087516,0.959901],[2.36372,6.001101,1.074346],[1.972022,6.079603,1.591175],[1.87615,5.976698,1.91554],[-3.824761,9.05372,-2.928615],[2.044704,6.129704,1.263111],[-2.583046,0.849537,2.497344],[-0.078825,2.342205,3.520322],[-0.704686,0.537165,3.397194],[-0.257449,3.235334,3.647545],[-0.332064,1.448284,3.022583],[-2.200146,0.898284,-0.447212],[-2.497508,1.745446,1.829167],[0.30702,4.416315,2.978956],[-3.205197,3.479307,-1.040582],[0.110069,9.347725,-1.563686],[-0.82754,0.883886,3.065838],[-2.017103,1.244785,2.42512],[-0.421091,2.309929,3.153898],[-0.491604,3.796072,3.16245],[2.786955,3.501241,-1.340214],[-3.229055,4.380713,-0.899241],[3.730768,0.76845,1.90312],[-0.561079,2.652382,3.152463],[-3.461471,3.086496,2.662505],[-0.661405,3.446009,3.179939],[-0.915351,0.636755,3.243708],[-2.992964,8.915628,-3.729833],[-0.439627,3.502104,3.42665],[-1.154217,0.883181,2.800835],[-1.736193,1.465474,2.595489],[-0.423928,3.24435,3.548277],[-0.511153,2.871046,3.379749],[-0.675722,2.991756,3.143262],[-1.092602,0.599103,3.090639],[-0.89821,2.836952,2.840023],[-2.658412,0.781376,0.960575],[-2.271455,1.222857,1.330478],[-0.877861,1.111222,2.72263],[-0.306959,2.876987,3.556044],[-3.839274,7.84138,-0.918404],[-0.172094,4.083799,3.141708],[-1.548332,0.2529,2.864655],[-0.217353,4.873911,-1.223104],[-3.384242,3.181056,-0.95579],[-2.731704,0.382421,2.895502],[-1.285037,0.551267,2.947675],[0.077224,4.246579,3.066738],[-0.479979,1.77955,2.860011],[-0.716375,1.224694,2.666751],[-0.54622,3.138255,3.393457],[-2.33413,1.821222,2.124883],[-0.50653,2.037147,2.897465],[2.451291,1.211389,-1.466589],[-3.160047,2.894081,2.724286],[-4.137258,5.433431,3.21201],[0.462896,0.320456,-0.174837],[-0.37458,2.609447,3.379253],[-3.095244,0.256205,2.196446],[-4.197985,5.732991,3.262924],[-0.729747,0.246036,0.497036],[-2.356189,5.062,-0.965619],[-1.609036,0.25962,-1.487367],[-4.074381,6.074061,3.409459],[-3.619304,4.0022,2.65705],[-0.543393,8.742896,-1.056622],[-4.30356,6.858934,2.879642],[-0.716688,2.901831,-2.11202],[1.547362,0.083189,1.138764],[-0.250916,0.275268,1.201344],[-3.778035,3.13624,2.466177],[-4.594316,5.771342,3.01694],[-3.717706,3.442887,2.603344],[-4.311163,5.224669,3.019373],[-0.610389,2.095161,-1.923515],[-3.040086,6.196918,-0.429149],[-3.802695,3.768247,2.545523],[-0.159541,2.043362,3.328549],[-3.744329,4.31785,2.491889],[-3.047939,0.214155,1.873639],[-4.41685,6.113058,3.166774],[-1.165133,0.460692,-1.742134],[-1.371289,4.249996,-1.317935],[-3.447883,0.3521,0.466205],[-4.495555,6.465548,2.944147],[-3.455335,0.171653,0.390816],[-3.964028,4.017196,2.376009],[-1.323595,1.763126,-0.750772],[-3.971142,5.277524,-0.19496],[-3.222052,0.237723,0.872229],[-4.403784,3.89107,1.872077],[-3.333311,0.342997,0.661016],[-4.495871,4.29606,1.63608],[-3.636081,2.760711,2.361949],[-4.487235,3.559608,1.66737],[-4.719787,7.26888,1.658722],[-1.086143,9.035741,-0.707144],[-2.339693,1.600485,-0.404817],[-4.642011,7.123829,1.990987],[-1.498077,3.854035,-1.369787],[-4.188372,4.729363,2.02983],[-3.116344,5.882284,-0.468884],[-4.305236,4.246417,1.976991],[-3.022509,0.22819,1.065688],[-2.799916,0.52022,1.128319],[-4.262823,3.534409,2.020383],[-4.221533,3.947676,2.11735],[-3.744353,4.391712,-0.6193],[-1.272905,0.156694,-1.741753],[-3.62491,2.669825,-0.549664],[-4.180756,3.096179,1.987215],[-4.059276,4.305313,2.232924],[-2.812753,0.183226,1.370267],[-4.032437,3.512234,2.309985],[-0.03787,0.28188,0.530391],[-4.711562,5.468653,2.822838],[-4.500636,6.953314,2.564445],[-4.479433,7.216991,2.270682],[3.990562,0.50522,0.716309],[-2.512229,6.863447,-0.100658],[-2.968058,6.956639,-0.37061],[2.550375,3.142683,-1.54068],[-2.320059,3.521605,-1.279397],[-4.556319,6.64662,2.745363],[-4.281091,7.108116,2.667598],[-2.050095,8.411689,0.121353],[-2.44854,1.135487,0.851875],[3.121815,0.699943,-0.277167],[-4.69877,6.00376,2.843035],[-1.360599,8.824742,-0.595597],[1.128437,0.171611,0.301691],[-4.360146,6.289423,0.042233],[1.400795,4.088829,-1.620409],[-3.193462,8.460137,-3.559446],[-3.168771,8.878431,-3.635795],[-3.434275,9.304302,-3.460878],[-3.349993,8.808093,-3.38179],[-3.304823,8.323865,-3.325905],[-3.572607,9.308843,-3.207672],[-3.166393,8.201215,-3.43014],[-3.451638,9.05331,-3.351345],[-3.309591,8.549758,-3.375055],[-3.527992,8.793926,-3.100376],[-3.6287,8.981677,-3.076319],[-3.445505,8.001887,-2.8273],[-3.408011,8.221014,-3.039237],[-3.65928,8.740382,-2.808856],[-3.878019,8.797295,-2.462866],[-3.515132,8.232341,-2.747739],[-3.460331,8.51524,-3.06818],[-3.403703,7.658628,-2.648789],[-3.507113,8.00159,-2.582275],[-3.607373,8.174737,-2.401723],[-3.749043,8.378084,-2.226959],[-3.648514,8.502213,-2.6138],[-2.534199,0.904753,2.021148],[1.4083,5.744252,-0.571402],[-3.852536,8.571009,-2.352358],[2.868255,5.373126,-0.163705],[2.224363,4.669891,-1.061586],[-4.528281,4.885838,1.340274],[1.30817,4.609629,-1.28762],[-4.519698,3.422501,1.354826],[-3.549955,7.783228,-2.332859],[1.12313,6.120856,0.045115],[-3.620324,7.57716,-2.033423],[-0.798833,2.624133,-1.992682],[-3.617587,7.783148,-2.051383],[-3.669293,8.103776,-2.10227],[-3.892417,8.667436,-2.167288],[-0.537435,0.285345,-0.176267],[-0.841522,3.299866,-1.887861],[-0.761547,3.647082,-1.798953],[-3.661544,7.85708,-1.867924],[-3.886763,8.551783,-1.889171],[-0.591244,1.549749,-1.714784],[-0.775276,1.908218,-1.597609],[-0.961458,2.573273,-1.695549],[-2.215672,1.335009,2.143031],[-4.622674,4.130242,1.220683],[1.07344,0.290099,1.584734],[-0.976906,2.92171,-1.76667],[-1.13696,3.194401,-1.513455],[-3.743262,7.99949,-1.629286],[-2.876359,4.900986,-0.879556],[0.550835,3.905557,-2.031372],[0.777647,4.992314,-1.215703],[1.445881,4.266201,-1.414663],[1.274222,5.510543,-0.824495],[-0.864685,2.318581,-1.702389],[-0.627458,3.820722,-1.743153],[-3.867699,8.30866,-1.850066],[1.635287,5.45587,-0.83844],[-1.037876,2.538589,-1.513504],[-4.38993,4.73926,1.699639],[0.048709,4.765232,-1.279506],[-0.626548,1.339887,-1.595114],[-3.682827,7.643453,-1.723398],[-3.868783,8.180191,-1.511743],[-0.76988,1.508373,-1.419599],[-1.138374,2.766765,-1.448163],[1.699883,5.780752,-0.475361],[1.214305,0.308517,1.866405],[-1.713642,0.373461,-1.265204],[-1.582388,0.58294,-1.267977],[-0.879549,1.821581,-1.313787],[0.519057,5.858757,-0.381397],[-3.770989,2.449208,-0.132655],[0.087576,0.156713,-1.53616],[-0.942622,2.146534,-1.421494],[-1.026192,1.022164,-1.145423],[-0.964079,1.645473,-1.067631],[-1.109128,2.458789,-1.29106],[-1.037478,0.209489,-1.805424],[-3.724391,7.599686,-1.273458],[-3.787898,7.951792,-1.304794],[3.821677,2.165581,-0.181535],[-2.39467,0.304606,-0.570375],[-2.352928,1.0439,2.079369],[-0.288899,9.640684,-1.006079],[-3.472118,7.263001,-1.080326],[-1.240769,0.972352,-0.976446],[-1.845253,0.356801,-0.995574],[-2.32279,7.915361,-0.057477],[-1.08092,2.179315,-1.168821],[4.598833,2.156768,0.280264],[-4.725417,6.442373,2.056809],[-0.490347,9.46429,-0.981092],[-1.99652,0.09737,-0.765828],[-1.137793,1.888846,-0.894165],[-0.37247,4.29661,-1.465199],[-0.184631,5.692946,-0.421398],[-3.751694,7.742231,-1.086908],[-1.001416,1.298225,-0.904674],[-3.536884,7.190777,-0.788609],[-3.737597,7.511281,-0.940052],[-1.766651,0.669388,-0.873054],[3.112245,3.474345,-1.129672],[-0.175504,3.81298,-2.0479],[-3.766762,7.412514,-0.681569],[-0.63375,9.439424,-0.785128],[-0.518199,4.768982,-1.258625],[0.790619,4.212759,-1.610218],[-3.761951,3.742528,-0.756283],[0.897483,5.679808,-0.612423],[2.221126,4.427468,-1.252155],[-0.728577,5.846457,0.062702],[0.194451,9.503908,-1.482461],[-0.099243,9.385459,-1.39564],[0.643185,3.636855,-2.180247],[0.894522,5.900601,-0.356935],[2.595516,4.75731,-0.893245],[1.108497,3.936893,-1.905098],[1.989894,5.789726,-0.343268],[-3.802345,7.655508,-0.613817],[2.339353,4.96257,-0.90308],[0.12564,4.013324,-1.879236],[-4.078965,3.683254,-0.445439],[2.092899,5.256128,-0.831607],[0.427571,0.291769,1.272964],[2.335549,3.480056,-1.581949],[-0.15687,0.324827,-1.648922],[-0.536522,5.760786,-0.203535],[1.507082,0.078251,-0.923109],[-1.854742,0.134826,2.698774],[-3.939827,3.168498,-0.526144],[-3.98461,3.39869,-0.533212],[-3.961738,4.217132,-0.489147],[4.273789,2.181164,0.153786],[-0.470498,5.645664,-0.439079],[-0.414539,5.488017,-0.673379],[-0.097462,5.062739,-1.114863],[1.198092,5.882232,-0.391699],[2.855834,5.085022,-0.498678],[1.037998,4.129757,-1.701811],[1.728091,5.068444,-1.063761],[-3.832258,2.625141,-0.311384],[-4.078526,3.070256,-0.284362],[-4.080365,3.954243,-0.440471],[-0.152578,5.276267,-0.929815],[-1.489635,8.928082,-0.295891],[0.759294,5.15585,-1.087374],[-4.000338,2.801647,-0.235135],[-4.290801,3.823209,-0.19374],[-4.221493,4.25618,-0.189894],[-4.066195,4.71916,-0.201724],[-0.155386,4.076396,-1.662865],[3.054571,4.414305,-0.825985],[-1.652919,8.726499,-0.388504],[-3.042753,0.560068,-0.126425],[-2.434456,1.118088,-0.213563],[-2.623502,1.845062,-0.283697],[-4.233371,3.43941,-0.202918],[2.726702,3.82071,-1.280097],[0.184199,4.14639,-1.673653],[-1.289203,0.624562,-1.560929],[-3.823676,7.382458,-0.407223],[0.476667,5.064419,-1.143742],[-3.873651,4.955112,-0.269389],[1.349666,5.312227,-1.000274],[-2.043776,8.434488,-0.108891],[-2.763964,0.733395,-0.129294],[-4.380505,3.664409,-0.024546],[-0.71211,5.341811,-0.803281],[-3.960858,7.183112,-0.118407],[-3.822277,7.712853,-0.263221],[-2.346808,8.108588,0.063244],[-1.841731,8.642999,-0.142496],[-2.600055,0.985604,-0.043595],[-3.513057,2.213243,-0.044151],[-3.963492,2.603055,-0.080898],[-4.258066,3.14537,-0.027046],[-4.261572,5.00334,0.13004],[0.795464,3.99873,-1.905688],[-3.300873,0.384761,0.013271],[-2.770244,0.881942,0.077313],[-3.456227,1.993871,0.301054],[-4.441987,3.914144,0.177867],[-4.367075,6.611414,0.165312],[-3.201767,0.576292,0.105769],[-3.174354,0.645009,0.440373],[-2.996576,0.74262,0.161325],[-2.724979,1.656497,0.092983],[-3.261757,2.017742,-0.070763],[-4.280173,4.518235,-0.002999],[-4.471073,5.945358,0.05202],[-3.877137,2.40743,0.274928],[-4.371219,4.252758,0.078039],[-3.400914,0.40983,0.238599],[-4.44293,3.523242,0.146339],[-4.574528,5.279761,0.353923],[-4.226643,7.191282,0.269256],[-4.16361,2.843204,0.097727],[-4.528506,5.011661,0.536625],[0.35514,5.664802,-0.572814],[2.508711,5.580976,-0.266636],[2.556226,3.633779,-1.426362],[1.878456,4.533714,-1.223744],[2.460709,4.440241,-1.1395],[2.218589,5.514603,-0.560066],[2.263712,5.737023,-0.250694],[2.964981,3.814858,-1.139927],[0.991384,5.304131,-0.999867],[2.81187,4.547292,-0.916025],[2.918089,4.768382,-0.702808],[3.262403,4.414286,-0.657935],[0.652136,6.089113,0.069089],[3.361389,3.5052,-0.946123],[2.613042,5.037192,-0.697153],[0.094339,4.36858,-1.451238],[3.290862,4.155716,-0.732318],[2.658063,4.073614,-1.217455],[3.260349,3.753257,-0.946819],[1.124268,4.862463,-1.207855],[3.35158,4.899247,-0.027586],[3.194057,4.691257,-0.524566],[3.090119,5.116085,-0.23255],[2.418965,3.811753,-1.419399],[2.191789,3.877038,-1.47023],[4.043166,2.034188,0.015477],[-1.026966,0.86766,-1.410912],[1.937563,3.860005,-1.617465],[2.98904,4.101806,-0.998132],[-0.142611,5.865305,-0.100872],[3.972673,2.292069,0.089463],[3.23349,3.959925,-0.849829],[0.16304,5.857276,-0.216704],[4.122964,1.770061,-0.114906],[2.099057,4.978374,-0.98449],[3.502411,3.76181,-0.667502],[2.079484,5.939614,-0.036205],[-0.084568,3.525193,-2.253506],[0.423859,4.06095,-1.845327],[1.6013,6.006466,-0.153429],[0.271701,3.844964,-2.078748],[0.273577,5.218904,-0.994711],[-0.410578,3.92165,-1.773635],[1.941954,5.60041,-0.621569],[0.100825,5.462131,-0.774256],[-0.53016,3.619892,-2.027451],[-0.822371,5.517453,-0.605747],[-2.474925,7.670892,-0.020174],[4.01571,0.830194,-0.013793],[-0.400092,5.094112,-1.041992],[-2.887284,5.581246,-0.525324],[-1.559841,6.050972,0.079301],[-0.469317,3.291673,-2.235211],[0.337397,3.467926,-2.295458],[-2.632074,5.573701,-0.582717],[-0.030318,6.011395,0.276616],[-0.934373,0.388987,-1.780523],[-2.661263,5.844838,-0.425966],[0.549353,5.489646,-0.807268],[-2.194355,6.197491,-0.109322],[-2.289618,5.664813,-0.581098],[1.583583,3.796366,-1.844498],[0.855295,0.215979,-1.425557],[-2.627569,5.300236,-0.767174],[4.333347,2.384332,0.399129],[-1.880401,5.583843,-0.696561],[-2.172346,5.324859,-0.846246],[-2.27058,5.906265,-0.388373],[-1.960049,5.889346,-0.397593],[0.965756,3.67547,-2.105671],[-2.014066,6.431125,0.287254],[-1.776173,5.287097,-0.89091],[-2.025852,5.089562,-0.980218],[-1.886418,6.108358,-0.000667],[-1.600803,5.785347,-0.491069],[-1.66188,4.968053,-1.042535],[-1.600621,5.962818,-0.188044],[-1.588831,5.615418,-0.665456],[4.46901,1.880138,0.057248],[-1.978845,0.927399,-0.554856],[-1.408074,5.325266,-0.83967],[1.923123,4.843955,-1.101389],[-2.87378,0.117106,-0.412735],[-1.222193,5.62638,-0.539981],[-2.632537,0.166349,-0.489218],[-1.370865,5.838832,-0.341026],[-1.067742,5.448874,-0.692701],[-1.073798,5.220878,-0.908779],[-1.147562,4.950417,-1.079727],[-2.789115,4.531047,-1.042713],[-3.550826,4.170487,-0.806058],[-3.331694,4.798177,-0.69568],[-3.689404,4.688543,-0.534317],[-3.511509,5.106246,-0.483632],[1.796344,0.076137,0.080455],[-3.306354,5.473605,-0.478764],[-2.692503,3.346604,-1.20959],[-3.963056,5.187462,3.113156],[-3.901231,6.391477,-0.246984],[4.484234,1.518638,-0.001617],[4.308829,1.657716,-0.119275],[4.290045,1.339528,-0.110626],[-3.514938,3.524974,-0.909109],[-2.1943,2.12163,-0.71966],[4.108206,1.091087,-0.11416],[3.785312,1.392435,-0.28588],[4.092886,1.480476,-0.210655],[-2.965937,6.469006,-0.379085],[-3.708581,2.962974,-0.63979],[-3.297971,2.218917,-0.299872],[3.806949,0.804703,-0.11438],[3.747957,1.059258,-0.273069],[-3.101827,4.111444,-1.006255],[-1.536445,4.658913,-1.195049],[-3.549826,2.450555,-0.375694],[-3.676495,2.108366,0.534323],[-3.674738,5.925075,-0.400011],[-2.250115,2.848335,-1.121174],[-3.698062,5.667567,-0.381396],[3.468966,0.734643,-0.190624],[-3.97972,5.670078,-0.26874],[-3.002087,4.337837,-1.033421],[-3.356392,2.608308,-0.713323],[-1.833016,3.359983,-1.28775],[-1.989069,3.632416,-1.305607],[3.591254,0.542371,0.026146],[3.364927,1.082572,-0.342613],[-3.393759,3.866801,-0.937266],[-4.124865,5.549529,-0.161729],[-4.423423,5.687223,0.000103],[-1.496881,2.601785,-1.114328],[-2.642297,6.496932,-0.264175],[-3.684236,6.819423,-0.320233],[-2.286996,3.167067,-1.246651],[-1.624896,8.44848,-0.530014],[-3.666787,2.159266,0.268149],[-2.402625,2.011243,-0.56446],[-2.736166,2.259839,-0.6943],[-2.168611,3.89078,-1.292206],[-2.065956,3.345708,-1.281346],[-2.778147,2.675605,-0.995706],[-3.507431,4.513272,-0.71829],[-2.301184,4.293911,-1.238182],[3.205808,0.211078,0.394349],[-2.129936,4.870577,-1.080781],[-2.287977,2.496593,-0.934069],[-2.701833,2.931814,-1.114509],[3.294795,0.50631,-0.081062],[-2.552829,7.468771,-0.021541],[3.06721,0.944066,-0.43074],[-2.86086,1.973622,-0.303132],[-3.598818,5.419613,-0.401645],[-1.524381,0.080156,-1.61662],[-1.907291,2.646274,-1.039438],[2.950783,0.407562,-0.105407],[-1.663048,1.655038,-0.689787],[-1.728102,1.110064,-0.635963],[-2.085823,7.686296,-0.159745],[2.883518,3.157009,-1.30858],[-2.724116,0.417169,-0.389719],[-1.788636,7.862672,-0.346413],[-2.186418,1.249609,-0.434583],[-3.092434,2.606657,-0.860002],[-1.737314,3.874201,-1.330986],[2.564522,0.422967,-0.390903],[1.670782,3.538432,-1.924753],[-2.338131,4.02578,-1.286673],[-1.916516,4.054121,-1.301788],[2.87159,2.034949,-1.267139],[-1.931518,3.062883,-1.197227],[-0.816602,0.135682,3.104104],[0.469392,0.213916,-1.489608],[2.574055,1.950091,-1.514427],[2.733595,2.682546,-1.461213],[-1.915407,4.693647,-1.151721],[-3.412883,5.867094,-0.450528],[2.28822,0.120432,-0.04102],[2.244477,0.14424,-0.376933],[-1.676198,3.570698,-1.328031],[-1.821193,4.366982,-1.266271],[-1.552208,8.099221,-0.53262],[-1.727419,2.39097,-0.989456],[-2.468226,4.711663,-1.069766],[-2.451669,6.113319,-0.273788],[2.635447,2.295842,-1.518361],[-2.020809,8.150253,-0.246714],[2.292455,0.805596,-1.3042],[2.641556,1.65665,-1.466962],[2.409062,2.842538,-1.635025],[2.456682,1.459484,-1.57543],[-1.691047,3.173582,-1.247082],[-1.865642,1.957608,-0.768683],[-3.401579,0.20407,0.100932],[2.301981,1.7102,-1.650461],[2.342929,2.611944,-1.690713],[-1.676111,2.923894,-1.17835],[-2.992039,3.547631,-1.118945],[-3.571677,6.504634,-0.375455],[2.141764,1.460869,-1.702464],[-3.221958,5.146049,-0.615632],[2.19238,2.949367,-1.747242],[2.320791,2.232971,-1.706842],[2.088678,2.585235,-1.813159],[-2.196404,0.592218,-0.569709],[-2.120811,1.836483,-0.62338],[-1.949935,2.271249,-0.874128],[2.235901,1.110183,-1.510719],[2.020157,3.241128,-1.803917],[2.054336,1.949394,-1.792332],[-3.094117,4.996595,-0.740238],[2.038063,0.635949,-1.402041],[1.980644,1.684408,-1.76778],[1.587432,3.306542,-1.991131],[1.935322,0.976267,-1.602208],[1.922621,1.235522,-1.698813],[1.712495,1.911874,-1.903234],[1.912802,2.259273,-1.888698],[1.884367,0.355453,-1.312633],[1.676427,0.76283,-1.539455],[1.78453,2.83662,-1.943035],[1.697312,0.120281,-1.150324],[1.648318,2.484973,-1.999505],[-4.051804,5.958472,-0.231731],[-1.964823,1.464607,-0.58115],[1.55996,2.183486,-1.971378],[1.628125,1.045912,-1.707832],[1.701684,1.540428,-1.827156],[1.567475,4.869481,-1.184665],[1.432492,0.843779,-1.648083],[1.173837,2.978983,-2.156687],[1.235287,3.37975,-2.09515],[1.252589,1.525293,-1.949205],[1.159334,2.336379,-2.105361],[1.49061,2.695263,-2.083216],[-4.122486,6.782604,-0.02545],[1.173388,0.279193,-1.423418],[1.505684,0.380815,-1.414395],[1.391423,1.343031,-1.843557],[1.263449,2.73225,-2.144961],[1.295858,0.597122,-1.515628],[1.245851,3.729126,-1.993015],[-2.761439,6.23717,-0.365856],[0.978887,1.664888,-2.046633],[1.219542,0.982729,-1.785486],[1.315915,1.91748,-2.02788],[-3.052746,2.127222,-0.369082],[0.977656,1.36223,-1.944119],[0.936122,3.39447,-2.203007],[-2.740036,4.184702,-1.122849],[0.853581,2.864694,-2.260847],[0.719569,0.818762,-1.763618],[0.839115,1.159359,-1.907943],[0.932069,1.94559,-2.117962],[0.579321,3.326747,-2.299369],[0.86324,0.597822,-1.565106],[0.574567,1.158452,-1.943123],[0.525138,2.137252,-2.213867],[0.779941,2.342019,-2.206157],[0.915255,2.618102,-2.209041],[0.526426,3.02241,-2.321826],[0.495431,2.521396,-2.295905],[0.80799,3.156817,-2.286432],[0.273556,1.304936,-2.012509],[0.664326,1.530024,-2.048722],[0.219173,2.32907,-2.323212],[0.405324,0.695359,-1.704884],[0.398827,0.946649,-1.843899],[0.345109,1.608829,-2.100174],[-2.356743,0.062032,-0.4947],[-3.001084,0.27146,2.560034],[-2.064663,0.303055,-0.697324],[0.221271,3.174023,-2.374399],[0.195842,0.437865,-1.621473],[-0.385613,0.297763,1.960096],[1.999609,0.108928,-0.79125],[0.351698,9.227494,-1.57565],[0.021477,2.191913,-2.309353],[0.246381,2.836575,-2.356365],[1.543281,0.237539,1.901906],[0.031881,9.147022,-1.454203],[-0.001881,1.648503,-2.108044],[0.333423,1.907088,-2.204533],[0.044063,2.634032,-2.368412],[-0.028148,3.053684,-2.390082],[0.02413,3.34297,-2.36544],[-0.272645,9.02879,-1.238685],[-0.006348,0.832044,-1.758222],[-0.321105,1.458754,-1.886313],[-0.153948,8.618809,-1.105353],[-0.409303,1.137783,-1.720556],[-0.410054,1.742789,-1.957989],[-0.287905,2.380404,-2.294509],[-0.261375,2.646629,-2.356322],[-0.221986,3.215303,-2.345844],[-0.31608,0.687581,-1.71901],[-0.537705,0.855802,-1.648585],[-0.142834,1.193053,-1.87371],[-0.24371,2.044435,-2.176958],[-0.437999,2.959748,-2.299698],[-0.78895,0.176226,-1.729046],[-0.608509,0.546932,-1.734032],[-0.693698,4.478782,-1.369372],[-0.669153,8.469645,-0.911149],[-0.741857,1.082705,-1.458474],[-0.554059,2.440325,-2.141785],[2.09261,0.153182,2.57581],[1.792547,0.111794,2.563777],[1.855787,0.189541,2.835089],[1.492601,0.232246,2.987681],[-0.284918,0.236687,3.429738],[2.604841,0.11997,1.01506],[0.331271,0.168113,3.124031],[0.280606,0.308368,2.495937],[0.544591,0.325711,2.081274],[0.193145,0.19154,-0.977556],[3.810099,0.42324,1.032202],[3.54622,0.379245,1.392814],[0.61402,0.276328,0.849356],[-1.198628,0.144953,2.911457],[4.17199,0.68037,1.391526],[0.88279,0.321339,2.059129],[1.93035,0.109992,2.054154],[1.620331,0.121986,2.37203],[2.374812,0.10921,1.734876],[-0.031227,0.294412,2.593687],[4.075018,0.561914,1.038065],[-0.570366,0.126583,2.975558],[0.950052,0.318463,1.804012],[1.130034,0.117125,0.98385],[2.123049,0.08946,1.665911],[2.087572,0.068621,0.335013],[2.927337,0.167117,0.289611],[0.528876,0.313434,3.205969],[1.174911,0.162744,1.328262],[-4.88844,5.59535,1.661134],[-4.709607,5.165338,1.324082],[0.871199,0.277021,1.263831],[-3.910877,2.349318,1.272269],[1.56824,0.118605,2.768112],[1.179176,0.152617,-0.858003],[1.634629,0.247872,2.128625],[-4.627425,5.126935,1.617836],[3.845542,0.54907,1.45601],[2.654006,0.165508,1.637169],[-0.678324,0.26488,1.974741],[2.451139,0.100377,0.213768],[0.633199,0.286719,0.403357],[-0.533042,0.2524,1.373267],[0.99317,0.171106,0.624966],[-0.100063,0.306466,2.170225],[1.245943,0.092351,0.661031],[1.390414,0.198996,-0.0864],[-4.457265,5.030531,2.138242],[2.89776,0.146575,1.297468],[1.802703,0.088824,-0.490405],[1.055447,0.309261,2.392437],[2.300436,0.142429,2.104254],[2.33399,0.187756,2.416935],[2.325183,0.134349,0.574063],[2.410924,0.370971,2.637115],[1.132924,0.290511,3.061],[1.764028,0.070212,-0.80535],[2.156994,0.397657,2.844061],[0.920711,0.225527,-0.882456],[-4.552135,5.24096,2.85514],[0.210016,0.309396,2.064296],[0.612067,0.136815,-1.086002],[3.150236,0.426757,1.802703],[-0.24824,0.282258,1.470997],[0.974269,0.301311,-0.640898],[-4.401413,5.03966,2.535553],[0.644319,0.274006,-0.817806],[0.332922,0.309077,0.108474],[3.610001,0.317447,0.689353],[3.335681,0.358195,0.118477],[0.623544,0.318983,-0.4193],[-0.11012,0.307747,1.831331],[-0.407528,0.291044,2.282935],[0.069783,0.285095,0.950289],[0.970135,0.310392,-0.283742],[0.840564,0.306898,0.098854],[-0.541827,0.267753,1.683795],[-3.956082,4.55713,2.297164],[-4.161036,2.834481,1.64183],[-4.093952,4.977551,2.747747],[2.661819,0.261867,1.926145],[-3.749926,2.161875,0.895238],[-2.497776,1.3629,0.791855],[0.691482,0.304968,1.582939],[-4.013193,4.830963,2.4769],[-3.639585,2.091265,1.304415],[-3.9767,2.563053,1.6284],[-3.979915,2.788616,1.977977],[0.388782,0.312656,1.709168],[-3.40873,1.877324,0.851652],[-3.671637,5.136974,3.170734],[-3.12964,1.852012,0.157682],[-3.629687,4.852698,2.686837],[-3.196164,1.793459,0.452804],[-3.746338,2.31357,1.648551],[2.992192,0.125251,0.575976],[-3.254051,0.054431,0.314152],[-3.474644,1.925288,1.134116],[-3.418372,2.022882,1.578901],[-2.920955,1.705403,0.29842],[-3.57229,2.152022,1.607572],[-3.251259,0.09013,-0.106174],[-3.299952,1.877781,1.348623],[-3.666819,2.441459,2.004838],[-2.912646,1.824748,-0.045348],[-3.399511,2.479484,2.340393],[-3.009754,0.015286,0.075567],[-3.381443,2.316937,2.156923],[-3.352801,2.133341,1.857366],[-3.01788,1.687685,0.645867],[-2.931857,1.678712,1.158472],[-3.301008,0.08836,0.591001],[1.358025,0.19795,1.599144],[-2.999565,1.845016,1.618396],[-2.767957,0.028397,-0.196436],[-2.93962,2.078779,2.140593],[-3.346648,2.674056,2.518097],[3.324322,0.20822,0.628605],[3.091677,0.137202,0.9345],[-2.881807,0.009952,0.318439],[-2.764946,1.786619,1.693439],[-2.905542,1.932343,1.900002],[-3.140854,2.271384,2.274946],[-2.88995,2.487856,2.574759],[-2.367194,-0.000943,-0.15576],[-3.050738,0.068703,0.742988],[-2.759525,1.55679,0.877782],[-3.151775,2.48054,2.482749],[-2.578618,-0.002885,0.165716],[-2.651618,1.877246,1.981189],[-2.933973,0.133731,1.631023],[1.047628,0.100284,-1.085248],[-1.585123,0.062083,-1.394896],[-2.287917,-0.002671,0.214434],[-2.524899,0.007481,0.471788],[-2.815492,2.188198,2.343294],[-2.095142,-0.003149,-0.094574],[-2.172686,-0.000133,0.47963],[-2.732704,0.074306,1.742079],[-2.49653,2.145668,2.42691],[-1.343683,0.047721,-1.506391],[-2.581185,0.048703,0.975528],[-2.905101,0.083158,2.010052],[-2.601514,2.007801,2.223089],[-2.339464,0.02634,1.484304],[-2.907873,0.10367,2.378149],[-1.368796,0.062516,-1.049125],[-1.93244,0.02443,-0.427603],[-2.705081,0.060513,2.303802],[3.372155,0.206274,0.892293],[-1.761827,0.093202,-1.037404],[-1.700667,0.0397,-0.614221],[-1.872291,0.011979,-0.135753],[-1.929257,0.074005,0.728999],[-2.520128,0.049665,1.99054],[-2.699411,0.10092,2.603116],[3.211701,0.27302,1.423357],[-1.445362,0.1371,-0.626491],[2.921332,0.259112,1.645525],[-0.993242,0.058686,-1.408916],[-0.944986,0.157541,-1.097665],[-2.154301,0.032749,1.882001],[-2.108789,1.988557,2.442673],[-1.015659,0.25497,-0.416665],[-1.898411,0.015872,0.16715],[-1.585517,0.027121,0.453445],[-2.311105,0.061264,2.327061],[-2.637042,0.152224,2.832201],[-2.087515,2.292972,2.617585],[-0.750611,0.056697,-1.504516],[-0.472029,0.075654,-1.360203],[-0.710798,0.139244,-1.183863],[-0.97755,0.26052,-0.831167],[-0.655814,0.260843,-0.880068],[-0.897513,0.275537,-0.133042],[-2.049194,0.084947,2.455422],[-0.177837,0.076362,-1.449009],[-0.553393,0.279083,-0.59573],[-1.788636,0.06163,2.231198],[-0.34761,0.255578,-0.999614],[-1.398589,0.036482,0.65871],[-1.133918,0.05617,0.69473],[-1.43369,0.058226,1.977865],[-2.505459,1.492266,1.19295]]\nexports.faces=[[2,1661,3],[1676,7,6],[712,1694,9],[3,1674,1662],[11,1672,0],[1705,0,1],[5,6,1674],[4,5,1674],[7,8,712],[2,1662,10],[1,10,1705],[11,1690,1672],[1705,11,0],[5,1676,6],[7,9,6],[7,712,9],[2,3,1662],[3,4,1674],[1,2,10],[12,82,1837],[1808,12,1799],[1808,1799,1796],[12,861,82],[861,1808,13],[1808,861,12],[1799,12,1816],[1680,14,1444],[15,17,16],[14,1678,1700],[16,17,1679],[15,1660,17],[14,1084,1678],[15,1708,18],[15,18,1660],[1680,1084,14],[1680,15,1084],[15,1680,1708],[793,813,119],[1076,793,119],[1076,1836,22],[23,19,20],[21,1076,22],[21,22,23],[23,20,21],[1076,119,1836],[806,634,470],[432,1349,806],[251,42,125],[809,1171,791],[953,631,827],[634,1210,1176],[157,1832,1834],[56,219,53],[126,38,83],[37,85,43],[59,1151,1154],[83,75,41],[77,85,138],[201,948,46],[1362,36,37],[452,775,885],[1237,95,104],[966,963,1262],[85,77,43],[36,85,37],[1018,439,1019],[41,225,481],[85,83,127],[93,83,41],[935,972,962],[116,93,100],[98,82,813],[41,75,225],[298,751,54],[1021,415,1018],[77,138,128],[766,823,1347],[593,121,573],[905,885,667],[786,744,747],[100,41,107],[604,334,765],[779,450,825],[968,962,969],[225,365,481],[365,283,196],[161,160,303],[875,399,158],[328,1817,954],[62,61,1079],[358,81,72],[74,211,133],[160,161,138],[91,62,1079],[167,56,1405],[56,167,219],[913,914,48],[344,57,102],[43,77,128],[1075,97,1079],[389,882,887],[219,108,53],[1242,859,120],[604,840,618],[754,87,762],[197,36,1362],[1439,88,1200],[1652,304,89],[81,44,940],[445,463,151],[717,520,92],[129,116,100],[1666,1811,624],[1079,97,91],[62,91,71],[688,898,526],[463,74,133],[278,826,99],[961,372,42],[799,94,1007],[100,93,41],[1314,943,1301],[184,230,109],[875,1195,231],[133,176,189],[751,755,826],[101,102,57],[1198,513,117],[748,518,97],[1145,1484,1304],[358,658,81],[971,672,993],[445,151,456],[252,621,122],[36,271,126],[85,36,126],[116,83,93],[141,171,1747],[1081,883,103],[1398,1454,149],[457,121,593],[127,116,303],[697,70,891],[457,891,1652],[1058,1668,112],[518,130,97],[214,319,131],[185,1451,1449],[463,133,516],[1428,123,177],[113,862,561],[215,248,136],[186,42,251],[127,83,116],[160,85,127],[162,129,140],[154,169,1080],[169,170,1080],[210,174,166],[1529,1492,1524],[450,875,231],[399,875,450],[171,141,170],[113,1155,452],[131,319,360],[44,175,904],[452,872,113],[746,754,407],[147,149,150],[309,390,1148],[53,186,283],[757,158,797],[303,129,162],[429,303,162],[154,168,169],[673,164,193],[38,271,75],[320,288,1022],[246,476,173],[175,548,904],[182,728,456],[199,170,169],[168,199,169],[199,171,170],[184,238,230],[246,247,180],[1496,1483,1467],[147,150,148],[828,472,445],[53,108,186],[56,53,271],[186,961,42],[1342,391,57],[1664,157,1834],[1070,204,178],[178,204,179],[285,215,295],[692,55,360],[192,193,286],[359,673,209],[586,195,653],[121,89,573],[202,171,199],[238,515,311],[174,210,240],[174,105,166],[717,276,595],[1155,1149,452],[1405,56,197],[53,283,30],[75,53,30],[45,235,1651],[210,166,490],[181,193,192],[185,620,217],[26,798,759],[1070,226,204],[220,187,179],[220,168,187],[202,222,171],[359,209,181],[182,456,736],[964,167,1405],[76,250,414],[807,1280,1833],[70,883,1652],[227,179,204],[221,199,168],[221,202,199],[360,494,131],[214,241,319],[105,247,166],[205,203,260],[388,480,939],[482,855,211],[8,807,1833],[226,255,204],[228,221,168],[166,173,490],[701,369,702],[211,855,262],[631,920,630],[1448,1147,1584],[255,227,204],[237,220,179],[228,168,220],[222,256,555],[215,259,279],[126,271,38],[108,50,186],[227,236,179],[236,237,179],[220,237,228],[228,202,221],[256,222,202],[555,256,229],[259,152,279],[27,1296,31],[186,50,961],[961,234,372],[1651,235,812],[1572,1147,1448],[255,226,1778],[255,236,227],[256,257,229],[106,184,109],[241,410,188],[177,578,620],[209,673,181],[1136,1457,79],[1507,245,718],[255,273,236],[275,410,241],[206,851,250],[1459,253,1595],[1406,677,1650],[228,274,202],[202,281,256],[348,239,496],[205,172,203],[369,248,702],[261,550,218],[261,465,550],[574,243,566],[921,900,1220],[291,273,255],[348,238,265],[109,230,194],[149,380,323],[443,270,421],[272,291,255],[274,228,237],[274,292,202],[281,257,256],[276,543,341],[152,259,275],[1111,831,249],[632,556,364],[299,273,291],[299,236,273],[280,237,236],[202,292,281],[247,246,173],[282,49,66],[1620,1233,1553],[299,280,236],[280,305,237],[237,305,274],[306,292,274],[330,257,281],[246,194,264],[166,247,173],[912,894,896],[611,320,244],[1154,1020,907],[969,962,290],[272,299,291],[305,318,274],[145,212,240],[164,248,285],[259,277,275],[193,164,295],[269,240,210],[1033,288,320],[46,948,206],[336,280,299],[330,281,292],[257,307,300],[369,136,248],[145,240,269],[502,84,465],[193,295,286],[164,285,295],[282,302,49],[161,303,429],[318,306,274],[306,330,292],[315,257,330],[315,307,257],[307,352,300],[300,352,308],[275,277,403],[353,1141,333],[1420,425,47],[611,313,320],[85,126,83],[128,1180,43],[303,116,129],[280,314,305],[314,318,305],[190,181,242],[203,214,131],[820,795,815],[322,299,272],[322,336,299],[315,339,307],[172,152,617],[172,214,203],[321,1033,320],[1401,941,946],[85,160,138],[976,454,951],[747,60,786],[317,322,272],[339,352,307],[266,33,867],[163,224,218],[247,614,180],[648,639,553],[388,172,205],[611,345,313],[313,345,320],[160,127,303],[454,672,951],[317,329,322],[314,280,336],[306,338,330],[330,339,315],[1236,115,436],[342,321,320],[1046,355,328],[328,346,325],[325,346,317],[367,314,336],[314,337,318],[337,306,318],[338,343,330],[342,320,345],[355,349,328],[346,329,317],[347,336,322],[314,362,337],[330,343,339],[340,308,352],[135,906,1022],[239,156,491],[194,230,486],[40,1015,1003],[321,355,1046],[329,382,322],[382,347,322],[347,367,336],[337,371,306],[306,371,338],[1681,296,1493],[286,172,388],[230,348,486],[348,183,486],[384,332,830],[328,349,346],[367,362,314],[371,343,338],[339,351,352],[57,344,78],[342,355,321],[386,346,349],[386,350,346],[346,350,329],[347,366,367],[343,363,339],[323,380,324],[152,275,241],[345,1045,342],[350,374,329],[339,363,351],[234,340,352],[353,361,354],[40,34,1015],[373,355,342],[373,349,355],[374,382,329],[366,347,382],[371,363,343],[351,379,352],[379,372,352],[372,234,352],[156,190,491],[319,241,692],[354,361,31],[366,377,367],[363,379,351],[133,590,516],[197,56,271],[1045,370,342],[370,373,342],[374,350,386],[377,366,382],[367,395,362],[400,337,362],[400,371,337],[378,363,371],[106,109,614],[181,673,193],[953,920,631],[376,349,373],[376,386,349],[378,379,363],[224,375,218],[279,152,172],[361,619,381],[1347,823,795],[760,857,384],[392,374,386],[394,395,367],[383,371,400],[383,378,371],[218,375,261],[197,271,36],[414,454,976],[385,376,373],[1051,382,374],[387,394,367],[377,387,367],[395,400,362],[279,172,295],[30,365,225],[450,231,825],[385,373,370],[398,374,392],[1051,377,382],[396,378,383],[348,496,183],[295,172,286],[357,269,495],[1148,390,1411],[75,30,225],[206,76,54],[412,386,376],[412,392,386],[396,383,400],[651,114,878],[123,1241,506],[238,311,265],[381,653,29],[618,815,334],[427,1032,411],[298,414,976],[791,332,384],[129,100,140],[412,404,392],[392,404,398],[140,107,360],[395,394,400],[423,379,378],[385,412,376],[406,94,58],[419,415,1021],[422,423,378],[423,125,379],[258,508,238],[311,156,265],[213,287,491],[449,411,1024],[412,1068,404],[55,140,360],[76,414,54],[394,416,400],[400,416,396],[422,378,396],[1258,796,789],[427,411,449],[427,297,1032],[1385,1366,483],[417,448,284],[1507,341,245],[162,140,444],[658,44,81],[433,125,423],[438,251,125],[429,162,439],[1342,57,1348],[765,766,442],[697,891,695],[1057,396,416],[440,423,422],[440,433,423],[433,438,125],[438,196,251],[74,482,211],[1136,79,144],[29,195,424],[242,1004,492],[57,757,28],[414,298,54],[238,348,230],[224,163,124],[295,215,279],[495,269,490],[449,446,427],[446,297,427],[1020,1163,909],[128,138,419],[66,980,443],[415,439,1018],[111,396,1057],[111,422,396],[840,249,831],[593,664,596],[218,550,155],[109,194,180],[483,268,855],[161,415,419],[1737,232,428],[360,107,494],[1006,1011,410],[444,140,55],[919,843,430],[190,242,213],[275,403,410],[131,494,488],[449,663,446],[138,161,419],[128,419,34],[439,162,444],[460,440,422],[440,438,433],[472,74,445],[491,190,213],[238,508,515],[46,206,54],[972,944,962],[1241,1428,1284],[111,460,422],[470,432,806],[248,164,702],[1025,467,453],[553,1235,648],[263,114,881],[267,293,896],[469,438,440],[455,196,438],[287,242,492],[239,265,156],[213,242,287],[1684,746,63],[663,474,446],[415,161,429],[140,100,107],[1055,459,467],[469,455,438],[259,542,277],[446,474,466],[446,466,447],[439,444,1019],[614,109,180],[190,359,181],[156,497,190],[726,474,663],[1023,458,459],[461,440,460],[269,210,490],[246,180,194],[590,133,189],[163,218,155],[467,468,453],[1063,1029,111],[111,1029,460],[1029,464,460],[461,469,440],[150,149,323],[828,445,456],[375,502,261],[474,475,466],[573,426,462],[478,1023,477],[478,458,1023],[458,479,467],[459,458,467],[468,393,453],[464,461,460],[484,365,455],[1232,182,1380],[172,617,214],[547,694,277],[542,547,277],[184,258,238],[261,502,465],[467,479,468],[484,455,469],[1380,182,864],[475,476,466],[80,447,476],[466,476,447],[415,429,439],[479,487,468],[487,287,468],[492,393,468],[260,469,461],[481,365,484],[531,473,931],[692,360,319],[726,495,474],[468,287,492],[480,464,1029],[260,461,464],[494,481,484],[74,472,482],[174,240,212],[223,106,614],[486,477,485],[478,496,458],[491,487,479],[123,402,177],[488,469,260],[488,484,469],[265,239,348],[248,215,285],[474,490,475],[477,486,478],[458,496,479],[239,491,479],[1584,1147,1334],[488,494,484],[401,123,506],[495,490,474],[490,173,475],[80,476,264],[491,287,487],[480,1029,1004],[480,205,464],[173,476,475],[485,194,486],[486,183,478],[478,183,496],[496,239,479],[848,1166,60],[268,262,855],[205,260,464],[260,203,488],[203,131,488],[246,264,476],[194,485,264],[1002,310,1664],[311,515,497],[515,359,497],[565,359,515],[1250,1236,301],[736,456,151],[654,174,567],[577,534,648],[519,505,645],[725,565,508],[150,1723,148],[584,502,505],[584,526,502],[502,526,84],[607,191,682],[560,499,660],[607,517,191],[1038,711,124],[951,672,971],[716,507,356],[868,513,1198],[615,794,608],[682,191,174],[1313,928,1211],[617,241,214],[511,71,91],[408,800,792],[192,286,525],[80,485,447],[91,97,130],[1675,324,888],[207,756,532],[582,1097,1124],[311,497,156],[510,130,146],[523,511,510],[608,708,616],[546,690,650],[511,527,358],[536,146,518],[465,418,550],[418,709,735],[520,514,500],[584,505,519],[536,518,509],[146,536,510],[538,527,511],[876,263,669],[646,524,605],[510,536,523],[527,175,358],[724,876,669],[721,724,674],[524,683,834],[558,509,522],[558,536,509],[523,538,511],[611,243,574],[528,706,556],[668,541,498],[523,537,538],[527,540,175],[532,756,533],[1013,60,747],[551,698,699],[92,520,500],[535,536,558],[536,569,523],[538,540,527],[539,548,175],[567,212,145],[401,896,293],[534,675,639],[1510,595,1507],[557,545,530],[569,536,535],[537,540,538],[540,539,175],[569,537,523],[1135,718,47],[587,681,626],[580,535,558],[99,747,278],[701,565,725],[665,132,514],[665,514,575],[132,549,653],[176,651,189],[65,47,266],[597,569,535],[569,581,537],[537,581,540],[563,539,540],[539,564,548],[1509,1233,1434],[132,653,740],[550,710,155],[714,721,644],[410,1011,188],[732,534,586],[560,562,729],[555,557,222],[580,558,545],[597,535,580],[581,563,540],[5,821,1676],[576,215,136],[649,457,741],[564,539,563],[124,711,224],[550,668,710],[550,541,668],[565,701,673],[560,613,499],[233,532,625],[545,555,580],[601,581,569],[594,904,548],[1463,1425,434],[185,149,1454],[721,674,644],[185,380,149],[577,424,586],[462,586,559],[597,601,569],[594,548,564],[566,603,574],[165,543,544],[457,89,121],[586,424,195],[725,587,606],[1078,582,1124],[588,925,866],[462,559,593],[189,878,590],[555,229,580],[602,563,581],[904,594,956],[434,1425,1438],[1024,112,821],[572,587,626],[600,597,580],[599,591,656],[600,580,229],[601,622,581],[581,622,602],[602,564,563],[602,594,564],[603,611,574],[498,529,546],[697,1145,70],[592,628,626],[610,597,600],[597,610,601],[222,557,171],[604,765,799],[573,462,593],[133,200,176],[729,607,627],[1011,692,188],[518,146,130],[585,687,609],[682,627,607],[1712,599,656],[562,592,607],[643,656,654],[257,600,229],[601,633,622],[623,594,602],[174,212,567],[725,606,701],[609,701,606],[610,633,601],[633,642,622],[380,216,324],[142,143,1249],[501,732,586],[534,577,586],[648,1235,577],[610,641,633],[310,1002,1831],[618,334,604],[1710,145,269],[707,498,659],[501,586,462],[625,501,462],[726,663,691],[300,600,257],[641,610,600],[622,629,602],[602,629,623],[55,692,444],[518,748,509],[929,1515,1411],[620,578,267],[71,511,358],[707,668,498],[650,687,585],[600,300,641],[641,657,633],[1675,888,1669],[622,636,629],[505,502,375],[541,529,498],[332,420,1053],[637,551,638],[534,639,648],[69,623,873],[300,512,641],[633,657,642],[562,660,579],[687,637,638],[709,646,605],[775,738,885],[559,549,132],[646,683,524],[641,512,657],[266,897,949],[1712,643,1657],[184,727,258],[674,724,669],[699,714,647],[628,659,572],[657,662,642],[571,881,651],[517,607,504],[598,706,528],[598,694,547],[640,552,560],[655,693,698],[698,693,721],[91,510,511],[144,301,1136],[324,216,888],[870,764,1681],[575,514,520],[276,544,543],[658,175,44],[645,505,711],[659,546,572],[700,524,655],[605,700,529],[266,867,897],[1695,1526,764],[579,659,628],[654,591,682],[586,549,559],[698,721,714],[896,401,506],[640,734,599],[664,665,575],[621,629,636],[1712,656,643],[547,644,598],[710,668,707],[640,560,734],[655,698,551],[694,528,277],[512,662,657],[504,592,626],[688,584,519],[152,241,617],[587,725,681],[598,669,706],[526,670,84],[598,528,694],[710,707,499],[579,592,562],[660,659,579],[323,324,1134],[326,895,473],[195,29,653],[84,670,915],[560,660,562],[504,626,681],[711,505,224],[651,881,114],[216,620,889],[1362,678,197],[493,99,48],[1659,691,680],[529,690,546],[430,843,709],[655,524,693],[174,191,105],[674,669,598],[98,712,82],[572,546,585],[72,61,71],[912,911,894],[106,223,184],[664,132,665],[843,646,709],[635,699,136],[699,698,714],[593,132,664],[688,526,584],[185,177,620],[533,675,534],[687,638,635],[1652,89,457],[896,506,912],[132,740,514],[689,685,282],[691,449,680],[48,436,493],[136,699,647],[739,640,554],[549,586,653],[532,533,625],[1530,695,649],[653,381,619],[736,151,531],[188,692,241],[177,402,578],[33,689,867],[689,33,685],[593,559,132],[949,65,266],[711,1038,661],[939,480,1004],[609,369,701],[616,552,615],[619,361,740],[151,463,516],[513,521,117],[691,663,449],[186,251,196],[333,302,327],[613,560,552],[616,613,552],[690,551,637],[660,707,659],[704,208,1203],[418,735,550],[163,708,124],[524,834,693],[554,640,599],[245,341,165],[565,673,359],[155,710,708],[105,191,517],[1515,198,1411],[1709,554,599],[60,289,786],[838,1295,1399],[533,534,625],[710,499,708],[556,632,410],[217,620,216],[591,627,682],[504,503,223],[643,654,567],[690,637,650],[545,557,555],[174,654,682],[719,691,1659],[727,681,508],[645,711,661],[794,615,739],[565,515,508],[282,685,302],[1150,397,1149],[638,699,635],[544,685,33],[719,726,691],[1742,1126,1733],[1724,1475,148],[556,410,403],[185,217,380],[503,504,681],[277,556,403],[32,1178,158],[1712,1709,599],[605,529,541],[635,136,369],[687,635,369],[529,700,690],[700,551,690],[89,304,573],[625,534,732],[730,302,685],[503,681,727],[702,673,701],[730,327,302],[327,353,333],[596,664,575],[660,499,707],[585,546,650],[560,729,734],[700,655,551],[176,571,651],[517,504,223],[730,685,544],[1661,1682,726],[1682,495,726],[1250,301,917],[605,524,700],[609,687,369],[516,389,895],[1553,686,1027],[673,702,164],[656,591,654],[520,596,575],[402,123,401],[828,456,728],[1645,677,1653],[528,556,277],[638,551,699],[190,497,359],[276,730,544],[1117,1525,933],[1027,686,1306],[155,708,163],[709,605,541],[647,644,547],[650,637,687],[599,734,591],[578,293,267],[1682,357,495],[510,91,130],[734,729,627],[576,542,215],[709,541,735],[735,541,550],[276,500,730],[500,327,730],[653,619,740],[414,851,454],[734,627,591],[729,562,607],[615,552,640],[525,181,192],[308,512,300],[223,503,727],[266,165,33],[92,500,276],[321,1046,1033],[585,609,606],[1200,1559,86],[628,572,626],[301,436,803],[714,644,647],[708,499,613],[721,693,724],[514,353,327],[353,740,361],[344,158,78],[708,613,616],[615,640,739],[500,514,327],[514,740,353],[1449,177,185],[462,233,625],[851,405,1163],[608,616,615],[647,542,576],[625,732,501],[1097,582,1311],[1235,424,577],[579,628,592],[607,592,504],[24,432,470],[105,614,247],[104,742,471],[542,259,215],[365,196,455],[1420,47,65],[223,727,184],[547,542,647],[572,585,606],[587,572,606],[262,780,1370],[647,576,136],[644,674,598],[271,53,75],[727,508,258],[471,742,142],[505,375,224],[357,1710,269],[725,508,681],[659,498,546],[743,1178,32],[1195,634,231],[1176,24,470],[743,1110,1178],[135,809,857],[63,746,407],[634,1176,470],[159,1112,27],[1176,1685,24],[399,450,779],[1178,856,875],[751,744,54],[436,48,772],[634,1108,1210],[769,1285,1286],[751,298,755],[746,1684,754],[754,924,87],[722,1625,756],[87,839,153],[489,795,820],[758,808,1518],[839,840,153],[831,1111,959],[1111,749,959],[810,1253,1363],[1247,1394,713],[1388,1329,1201],[1242,120,761],[857,791,384],[758,1523,808],[296,764,1504],[70,1652,891],[207,233,1638],[1348,57,28],[858,420,332],[964,1379,1278],[420,1194,816],[784,1076,1186],[1076,21,1186],[1710,767,1],[849,822,778],[806,137,787],[786,790,744],[790,54,744],[771,63,407],[785,852,818],[774,1823,272],[895,151,516],[135,1022,809],[99,826,48],[48,826,755],[808,705,408],[833,441,716],[1733,743,32],[1385,836,852],[772,827,737],[1005,49,781],[793,1697,813],[1518,441,1537],[1139,1132,859],[782,801,770],[1510,1530,676],[770,814,835],[231,787,825],[207,722,756],[26,771,798],[782,863,865],[832,54,790],[865,842,507],[799,765,94],[1175,1261,1353],[800,408,805],[262,986,200],[792,800,814],[801,792,770],[704,1203,1148],[356,1514,822],[165,544,33],[561,776,113],[1043,738,775],[815,831,820],[773,792,801],[772,48,914],[772,737,803],[436,772,803],[808,817,705],[1624,822,1527],[588,1144,788],[799,762,604],[821,1520,1676],[854,803,666],[828,482,472],[445,74,463],[831,489,820],[828,836,482],[716,782,763],[334,815,766],[815,823,766],[334,766,765],[819,805,837],[1716,1521,1412],[1684,924,754],[800,805,819],[1709,829,554],[806,1349,137],[99,1013,747],[341,595,276],[817,810,818],[1176,1691,1685],[763,782,865],[830,846,1052],[865,1499,842],[982,846,1053],[847,832,790],[1178,875,158],[817,818,705],[1302,1392,45],[96,417,284],[223,614,517],[356,507,1514],[1166,848,1179],[1349,432,26],[717,92,276],[770,835,863],[522,509,1745],[847,841,832],[832,841,46],[829,739,554],[802,824,39],[397,1043,775],[1567,849,778],[1385,483,855],[1349,26,1346],[441,801,782],[402,401,293],[1043,667,738],[759,798,1007],[819,837,728],[728,837,828],[837,852,828],[1537,441,833],[148,1475,147],[805,705,837],[716,441,782],[483,1371,780],[814,819,844],[845,753,1336],[1661,719,4],[862,847,790],[737,827,666],[201,46,841],[810,785,818],[408,705,805],[1560,1536,849],[1585,853,1786],[7,1668,807],[7,807,8],[822,1514,1527],[800,819,814],[847,862,841],[991,857,760],[705,818,837],[808,408,773],[402,293,578],[791,858,332],[1480,1228,1240],[814,844,835],[785,1385,852],[1132,120,859],[1743,1726,684],[1704,783,1279],[1623,1694,1731],[959,489,831],[1518,808,773],[862,872,841],[441,773,801],[331,512,308],[380,217,216],[841,872,201],[818,852,837],[448,1480,1240],[856,1108,1195],[1527,1514,1526],[819,182,1232],[871,724,693],[852,836,828],[770,792,814],[803,737,666],[751,826,278],[1674,1727,1699],[849,356,822],[871,693,834],[507,842,1514],[1406,1097,869],[1328,1349,1346],[823,815,795],[744,751,278],[1110,856,1178],[520,717,316],[871,834,683],[884,876,724],[165,266,47],[716,763,507],[216,889,888],[853,1585,1570],[1536,716,356],[886,873,623],[782,770,863],[432,24,26],[683,882,871],[884,724,871],[114,876,884],[516,590,389],[11,1218,1628],[862,113,872],[886,623,629],[830,1052,1120],[762,153,604],[773,408,792],[763,865,507],[153,840,604],[882,884,871],[531,151,326],[886,890,873],[133,262,200],[819,1232,844],[621,636,122],[645,892,519],[1130,1076,784],[114,263,876],[1670,10,1663],[911,670,894],[452,885,872],[872,885,201],[887,882,683],[878,884,882],[590,878,882],[890,867,689],[897,629,621],[897,886,629],[819,728,182],[519,893,688],[894,670,526],[898,894,526],[1536,356,849],[810,1363,785],[878,114,884],[879,888,892],[892,889,893],[893,898,688],[895,683,843],[895,887,683],[889,620,267],[590,882,389],[418,465,84],[949,897,621],[897,890,886],[889,267,893],[898,267,896],[531,326,473],[189,651,878],[843,683,646],[897,867,890],[888,889,892],[893,267,898],[896,894,898],[473,895,843],[895,389,887],[974,706,669],[513,1115,521],[326,151,895],[809,791,857],[211,262,133],[920,923,947],[923,90,947],[90,25,947],[25,972,935],[64,431,899],[52,899,901],[903,905,59],[437,967,73],[839,1242,761],[904,975,44],[917,301,144],[915,670,911],[905,201,885],[1684,63,1685],[1033,1194,288],[950,913,755],[912,918,911],[950,914,913],[506,918,912],[922,919,915],[911,922,915],[1004,451,492],[1263,553,639],[922,911,918],[630,920,947],[916,506,926],[916,918,506],[521,1115,1098],[916,922,918],[919,418,915],[83,38,75],[24,1685,771],[110,1230,1213],[712,8,1837],[922,930,919],[919,430,418],[1395,1402,1187],[930,922,916],[594,623,69],[35,431,968],[35,968,969],[866,924,1684],[1625,1263,675],[631,630,52],[930,931,919],[430,709,418],[302,333,49],[1446,978,1138],[799,1007,798],[931,843,919],[947,25,64],[885,738,667],[1262,963,964],[899,970,901],[1401,946,938],[1117,933,1091],[1685,63,771],[905,948,201],[979,937,980],[951,953,950],[937,270,443],[1154,903,59],[1194,954,1067],[909,405,907],[850,1151,59],[1769,811,1432],[76,206,250],[938,946,966],[965,927,942],[938,966,957],[955,975,904],[927,965,934],[52,51,631],[59,905,667],[431,935,968],[786,289,561],[252,122,671],[481,494,107],[954,1817,1067],[795,25,90],[958,965,945],[795,972,25],[902,983,955],[972,489,944],[1256,29,424],[671,331,945],[946,958,963],[956,955,904],[902,955,956],[671,512,331],[945,331,961],[662,671,122],[671,662,512],[934,65,927],[630,947,52],[666,631,910],[850,59,667],[961,331,234],[1024,411,1042],[890,69,873],[252,671,945],[975,290,940],[283,186,196],[30,283,365],[950,755,298],[946,965,958],[985,290,975],[969,290,985],[405,851,206],[935,431,64],[941,1423,1420],[964,963,167],[942,252,945],[78,757,57],[49,1005,66],[937,979,270],[631,666,827],[980,937,443],[66,689,282],[421,902,956],[947,64,52],[35,979,899],[951,971,953],[762,87,153],[27,31,381],[924,839,87],[946,963,966],[331,308,340],[957,966,1262],[473,843,931],[953,971,920],[270,969,902],[935,962,968],[51,1005,781],[969,983,902],[437,73,940],[69,421,956],[761,249,840],[263,974,669],[962,944,967],[962,437,290],[985,975,955],[907,405,948],[720,957,1262],[25,935,64],[176,200,571],[108,945,50],[250,851,414],[200,986,571],[881,974,263],[827,772,953],[970,899,980],[29,159,27],[234,331,340],[948,405,206],[980,899,979],[986,984,571],[571,984,881],[990,706,974],[946,934,965],[970,980,66],[1113,1486,1554],[984,981,881],[881,987,974],[689,66,443],[1005,901,66],[983,985,955],[165,47,718],[987,990,974],[1370,986,262],[901,970,66],[51,901,1005],[981,987,881],[988,706,990],[942,945,965],[290,437,940],[64,899,52],[988,556,706],[941,934,946],[431,35,899],[996,989,984],[984,989,981],[981,989,987],[35,969,270],[1370,995,986],[986,995,984],[989,999,987],[987,992,990],[992,988,990],[962,967,437],[951,950,976],[979,35,270],[421,270,902],[998,995,1370],[987,999,992],[988,364,556],[969,985,983],[689,443,890],[995,1000,984],[219,958,108],[998,1000,995],[999,997,992],[914,953,772],[845,1336,745],[806,787,231],[1000,996,984],[989,996,999],[50,945,961],[443,421,69],[797,158,779],[1098,1463,434],[996,1009,999],[1001,988,992],[1001,364,988],[903,907,905],[26,759,973],[997,1001,992],[632,364,1001],[1346,26,973],[998,1008,1000],[1000,1009,996],[531,931,736],[252,949,621],[286,388,525],[1174,1008,998],[1009,1010,999],[999,1010,997],[1014,1001,997],[614,105,517],[958,945,108],[525,1004,242],[963,958,219],[233,426,304],[1000,1008,1009],[1010,1014,997],[1001,1006,632],[824,413,39],[642,636,622],[480,388,205],[28,757,797],[1014,1006,1001],[1006,410,632],[975,940,44],[1234,420,858],[54,832,46],[1009,1012,1010],[167,963,219],[41,481,107],[1017,1010,1012],[122,636,662],[939,525,388],[525,939,1004],[950,953,914],[829,1735,739],[1008,880,1015],[1008,1015,1009],[1263,639,675],[956,594,69],[795,90,1347],[1179,848,1013],[759,1007,973],[1009,1015,1012],[1012,1016,1017],[1017,1014,1010],[1019,1011,1006],[927,65,949],[649,316,595],[913,48,755],[976,950,298],[1003,1015,880],[1018,1006,1014],[1021,1018,1014],[444,692,1011],[451,1029,1063],[1185,851,1163],[29,27,381],[181,525,242],[1021,1014,1017],[1016,1021,1017],[1018,1019,1006],[1019,444,1011],[927,949,942],[451,393,492],[903,1154,907],[391,101,57],[94,765,58],[419,1016,1012],[949,252,942],[907,1020,909],[765,442,58],[94,406,908],[1007,94,908],[34,1012,1015],[34,419,1012],[419,1021,1016],[451,1057,393],[907,948,905],[1034,1073,1039],[1061,906,1619],[1068,960,1034],[471,1249,104],[112,1024,1042],[372,379,125],[341,543,165],[141,1094,170],[566,243,1061],[398,1034,1039],[325,317,1823],[1493,296,1724],[850,667,1043],[1054,297,1065],[1619,135,1074],[1061,243,906],[680,1024,821],[1103,96,1245],[1440,1123,1491],[1047,1025,1044],[672,454,1231],[1484,697,1530],[993,672,1231],[178,154,1088],[1044,1041,1066],[112,1062,1058],[1530,649,676],[178,1088,1040],[1046,328,954],[243,244,1022],[954,1194,1033],[1042,411,1032],[971,993,1056],[960,1093,1034],[1754,1338,232],[385,1064,412],[1057,1063,111],[748,1071,1447],[1530,697,695],[971,1056,1270],[977,1059,1211],[649,741,316],[1060,1452,1030],[353,354,1323],[695,768,649],[398,404,1034],[596,316,741],[1836,119,13],[1513,1115,1528],[883,1081,1652],[1039,1073,1048],[462,426,233],[31,1296,354],[1055,1047,1066],[1032,1054,1045],[1521,310,1224],[119,861,13],[1194,1234,288],[1109,1771,1070],[1166,1160,776],[1044,1035,1041],[1026,960,1064],[1050,1032,1045],[1049,1041,387],[115,1013,99],[1046,954,1033],[1321,920,971],[611,1058,345],[1048,1066,1049],[1023,1055,1073],[1029,451,1004],[118,1094,141],[1094,1080,170],[1042,1032,1050],[1026,1064,385],[15,16,1084],[1096,1079,61],[1075,1071,748],[325,1817,328],[909,1163,405],[1022,1234,809],[374,398,1051],[1082,72,81],[1023,1034,1093],[1817,1794,1067],[86,1445,1400],[1507,1535,1510],[1079,1096,1075],[568,1478,1104],[1070,178,1040],[1034,1023,1073],[776,1155,113],[1103,143,142],[1140,81,73],[1082,81,1140],[1060,1030,936],[1040,1086,1109],[370,1065,385],[61,72,1082],[1087,1096,1144],[1040,1088,1086],[1651,812,752],[1062,1050,1045],[187,154,178],[179,187,178],[1099,1344,1101],[1668,1058,807],[1073,1055,1048],[1099,1336,1344],[1283,943,1123],[1049,387,1051],[1024,680,449],[61,1082,1100],[967,749,1111],[1439,1037,88],[742,1505,142],[398,1039,1051],[1107,1336,1099],[1344,1542,1101],[142,1505,1103],[477,1093,447],[477,1023,1093],[471,142,1249],[1041,1035,394],[1328,568,1104],[61,1100,1096],[154,1092,1088],[112,1042,1050],[154,187,168],[435,235,45],[1075,1096,1087],[97,1075,748],[1049,1066,1041],[816,1067,1028],[846,982,1142],[1245,96,284],[1092,154,1080],[1057,451,1063],[387,377,1051],[1055,1025,1047],[1075,1087,1089],[1106,1108,856],[1068,1034,404],[1480,1545,868],[906,135,1619],[1074,991,1095],[570,566,1061],[1025,453,1044],[745,1336,1107],[1035,1057,416],[1092,1102,1129],[1074,135,991],[1105,745,1107],[447,1026,446],[394,387,1041],[73,81,940],[1118,1108,1106],[1210,1108,874],[243,1022,906],[412,1064,1068],[1280,611,603],[960,447,1093],[1051,1039,1049],[1040,1109,1070],[1471,1037,1439],[69,890,443],[1377,703,1374],[1092,1080,1102],[1096,1100,788],[1096,788,1144],[1114,967,1111],[446,1026,297],[70,1112,883],[453,393,1057],[1118,874,1108],[1054,370,1045],[1080,1094,1102],[1039,1048,1049],[428,753,845],[1047,1044,1066],[1044,453,1035],[1472,731,1512],[1126,1121,743],[743,1121,1110],[1032,297,1054],[1480,868,1216],[71,358,72],[1133,967,1114],[1105,1119,745],[1035,453,1057],[1026,447,960],[454,851,1190],[1030,1477,652],[589,816,1028],[1110,1121,1106],[1122,1118,1106],[1116,874,1118],[1048,1055,1066],[1194,1067,816],[744,278,747],[745,1120,845],[845,1052,428],[1105,1780,1119],[1065,297,385],[1098,1529,1463],[731,1060,936],[235,434,812],[1445,1525,1117],[1106,1121,1122],[1122,1127,1118],[1127,1116,1118],[1094,118,1732],[1119,1120,745],[1406,1124,1097],[435,117,235],[1462,1440,1037],[1126,1129,1121],[1088,1092,1129],[1133,73,967],[1120,1052,845],[812,434,752],[1441,1559,1200],[1131,588,413],[1054,1065,370],[235,1098,434],[1052,1142,428],[1737,428,1142],[1496,1446,1483],[1182,1083,1654],[1121,1129,1122],[1732,1116,1127],[768,457,649],[761,1114,249],[1064,960,1068],[1135,1481,1136],[1126,952,1129],[1087,588,1131],[1087,1144,588],[859,788,1139],[1140,1133,1132],[1133,1140,73],[1822,570,1061],[394,1035,416],[1055,1023,459],[80,264,485],[1119,1128,1120],[145,1658,567],[695,891,768],[1129,1102,1122],[1122,1102,1127],[1416,1077,1413],[297,1026,385],[1052,846,1142],[1445,1117,1400],[952,1086,1129],[1714,1089,1131],[1131,1089,1087],[1100,1139,788],[112,1050,1062],[1323,354,1296],[49,333,1141],[1142,982,1737],[79,1457,1091],[1088,1129,1086],[1102,1094,1127],[1127,1094,1732],[1100,1082,1139],[1082,1132,1139],[1082,1140,1132],[1150,1043,397],[60,1166,289],[1696,1146,1698],[1297,1202,1313],[409,1297,1313],[1234,1194,420],[1408,1391,1394],[424,1235,1243],[1203,309,1148],[485,477,447],[1152,1156,850],[1153,1149,1155],[1153,1157,1149],[1149,1152,1150],[1156,1154,1151],[776,1153,1155],[1157,1152,1149],[1217,1393,1208],[1156,1159,1154],[1153,1165,1157],[1165,1152,1157],[1159,1020,1154],[1161,1153,776],[1161,1165,1153],[1165,1158,1152],[1152,1158,1156],[1158,1159,1156],[1166,776,561],[1160,1161,776],[1161,1164,1165],[1161,1160,1164],[1158,1162,1159],[1159,1162,1020],[1270,1321,971],[1164,1170,1165],[1165,1162,1158],[1162,1163,1020],[588,788,925],[1166,1167,1160],[1165,1170,1162],[1160,1167,1164],[1162,1170,1163],[1179,1167,1166],[1167,1168,1164],[1164,1168,1170],[1168,1169,1170],[1234,1022,288],[802,39,866],[1179,1168,1167],[1169,1173,1170],[1170,1173,1163],[1173,1185,1163],[1360,1267,1364],[1169,1185,1173],[611,244,243],[900,1226,1376],[1260,1408,1350],[618,840,831],[1181,1183,1179],[1179,1184,1168],[1208,1274,1291],[1183,1184,1179],[1168,1184,1169],[1387,1395,1254],[1208,1204,1172],[1182,1197,1083],[1187,1083,1197],[1213,1183,1181],[1169,1207,1185],[135,857,991],[1013,1213,1181],[1189,1183,1213],[1183,1189,1184],[1169,1184,1207],[1207,1190,1185],[1180,1389,1288],[1191,1192,1640],[1640,1192,1090],[1090,1205,1654],[1654,1205,1182],[1188,1395,1187],[1126,743,1733],[788,859,925],[809,1234,1171],[1193,1197,1182],[1189,1199,1184],[1639,1191,1637],[1639,1212,1191],[1205,1193,1182],[1198,1187,1197],[1199,1207,1184],[332,1053,846],[1090,1192,1205],[117,1188,1187],[435,1188,117],[435,1206,1188],[1199,1189,1213],[420,816,1053],[1212,1215,1191],[117,1187,1198],[45,1206,435],[120,1132,1133],[874,1116,1210],[1191,1215,1192],[1193,1216,1197],[1216,1198,1197],[1199,1214,1207],[117,521,235],[1220,1311,1078],[1220,900,1311],[1653,1215,1212],[1192,1225,1205],[1205,1209,1193],[1209,1216,1193],[1389,1217,1172],[1207,1214,454],[171,557,1747],[1805,1078,1787],[1805,1219,1078],[1198,1216,868],[666,910,854],[1230,1231,1213],[1213,1231,1199],[1199,1231,1214],[1219,1220,1078],[1215,1221,1192],[1192,1221,1225],[1225,1228,1205],[1205,1228,1209],[1209,1228,1216],[1464,1325,1223],[1215,1227,1221],[1228,1480,1216],[1226,1653,1376],[1653,1249,1215],[1221,1240,1225],[1225,1240,1228],[839,761,840],[1238,1219,1805],[1238,1220,1219],[1232,1380,1375],[1226,1249,1653],[1221,1227,1240],[233,207,532],[110,1236,1230],[1248,1231,1230],[1231,454,1214],[1249,1227,1215],[1248,1056,1231],[489,959,944],[448,1240,284],[925,859,1242],[1805,1244,1238],[1252,1220,1238],[1252,921,1220],[1236,1251,1230],[1230,1251,1248],[1056,993,1231],[1031,1264,1263],[68,1186,157],[1227,1245,1240],[1103,1245,143],[1243,1235,612],[1252,95,921],[1249,1226,1237],[1390,1387,1254],[1120,384,830],[830,332,846],[1227,143,1245],[1315,1369,1358],[1356,1269,1386],[972,795,489],[1831,1224,310],[1250,1255,1251],[1251,1056,1248],[1256,1243,103],[658,358,175],[1620,1238,1244],[1620,1252,1238],[1506,95,1252],[104,1249,1237],[1249,143,1227],[1268,1419,1329],[634,806,231],[618,831,815],[924,1242,839],[1255,1270,1251],[1251,1270,1056],[866,925,1242],[103,29,1256],[424,1243,1256],[134,1651,752],[1250,917,1255],[1172,1204,1260],[1352,1036,1276],[1265,1201,1329],[804,1282,1259],[1259,1294,723],[335,1330,1305],[407,762,799],[875,856,1195],[32,158,344],[967,944,749],[372,125,42],[1175,1354,1261],[553,612,1235],[1259,1273,1294],[1294,1283,723],[757,78,158],[407,799,798],[901,51,52],[139,1386,1389],[1386,1269,1389],[1389,1269,1217],[1148,1590,1268],[1428,1449,1450],[804,1281,1282],[1273,1259,1282],[158,399,779],[771,407,798],[521,1098,235],[917,1312,1255],[1312,1270,1255],[1217,1269,1393],[1195,1108,634],[1110,1106,856],[1210,1691,1176],[27,1112,1145],[1296,27,1145],[1171,858,791],[704,1148,1290],[1430,1436,1437],[1282,1308,1273],[1300,943,1283],[1393,1355,1274],[720,1278,769],[1287,1059,1399],[1310,1388,1272],[1312,1321,1270],[851,1185,1190],[1296,1145,1304],[26,24,771],[51,910,631],[1329,1290,1268],[1290,1148,1268],[1298,1293,733],[1281,1293,1282],[1282,1293,1308],[1308,1299,1273],[1300,1283,1294],[1340,943,1300],[1340,1301,943],[407,754,762],[1287,1399,1295],[34,139,128],[1288,1172,1260],[120,1133,1114],[1306,1113,1511],[1464,1223,1292],[1299,1294,1273],[1299,1300,1294],[1286,1295,838],[1285,1247,1286],[1247,713,1286],[1201,1265,1390],[1378,1368,1357],[1482,1320,917],[917,1320,1312],[850,1156,1151],[588,39,413],[1324,1306,686],[789,1365,928],[1223,1326,1292],[1292,1326,1298],[869,1097,1311],[790,786,561],[1323,1304,932],[1323,1296,1304],[1317,1324,686],[1306,368,1113],[1325,1342,1223],[1326,1348,1298],[1293,1327,1308],[1308,1318,1299],[704,1290,1258],[1320,1321,1312],[761,120,1114],[1684,802,866],[1674,6,1727],[1316,1323,932],[1335,1337,1305],[1348,1327,1293],[1298,1348,1293],[1333,1300,1299],[1333,1343,1300],[1328,1301,1340],[1328,1314,1301],[838,1399,1319],[921,1237,900],[409,1391,1408],[1376,1653,677],[1281,804,1458],[1331,1324,1317],[1324,368,1306],[368,1338,1307],[1327,797,1308],[797,1345,1308],[1308,1345,1318],[1318,1333,1299],[1341,1147,1572],[923,1321,1320],[923,920,1321],[39,588,866],[1141,1323,1316],[1330,1335,1305],[1337,1335,1336],[1339,1332,1325],[1223,1342,1326],[1342,1348,1326],[1348,797,1327],[1345,1333,1318],[1343,1340,1300],[1419,1265,1329],[1347,1320,1584],[1535,1141,1316],[1078,1311,582],[1344,1335,1330],[753,1331,1337],[368,1324,1331],[753,368,1331],[1332,1485,1325],[1325,1485,1342],[787,1343,1333],[137,1328,1340],[973,1341,1479],[406,1147,1341],[1171,1234,858],[1141,1535,1322],[49,1141,1322],[1344,1336,1335],[973,908,1341],[766,1347,1584],[1347,923,1320],[781,49,1322],[368,232,1338],[787,1340,1343],[787,137,1340],[568,1346,973],[58,1147,406],[442,1334,1147],[58,442,1147],[442,766,1334],[90,923,1347],[428,368,753],[779,1333,1345],[825,787,1333],[137,1349,1328],[1328,1346,568],[908,406,1341],[924,866,1242],[1336,753,1337],[428,232,368],[1115,777,1098],[1348,28,797],[797,779,1345],[779,825,1333],[1007,908,973],[583,1351,880],[1365,1246,977],[1658,145,1710],[1310,796,1388],[718,245,165],[1302,1272,1254],[1174,1351,583],[1174,715,1351],[1358,1260,1204],[1374,1373,1276],[1377,1374,1276],[678,1362,1382],[1377,1276,254],[139,34,40],[1008,1174,583],[1396,1286,1319],[768,891,457],[1316,932,1535],[1289,1371,1360],[182,736,864],[1355,1364,1274],[860,1367,1354],[1362,1222,1382],[1376,869,1311],[1590,1411,198],[1232,1375,877],[1394,1295,1286],[880,1356,1386],[880,1351,1356],[1211,1059,1287],[197,678,1405],[880,1386,1003],[1368,1253,1357],[1357,1253,1036],[715,1289,1364],[1354,1367,703],[1383,877,1375],[1266,1288,1260],[1373,1374,703],[1372,1289,1174],[1303,1366,1378],[1351,715,1355],[1665,1666,624],[1309,1357,1036],[900,1237,1226],[1174,1289,715],[1337,1331,1317],[1360,1303,1359],[1267,1354,1175],[1241,1284,1414],[1377,254,929],[1385,855,836],[1396,1319,1436],[1361,1366,1303],[1381,1368,1378],[1313,1211,1391],[1368,1385,1363],[813,82,861],[1058,1280,807],[893,519,892],[1359,1303,860],[1382,1350,1247],[1371,1303,1360],[1267,1175,1271],[769,1286,1396],[712,1837,82],[1366,1385,1381],[1365,796,1310],[1003,1386,40],[780,1371,1370],[561,862,790],[1284,1380,864],[1449,1428,177],[611,1280,1058],[1284,1375,1380],[926,506,1241],[1305,1337,1317],[309,1203,208],[1388,1201,1390],[1309,1036,1352],[1377,929,1411],[1399,1059,1257],[1112,70,1145],[289,1166,561],[1288,1389,1172],[1362,37,1180],[713,1394,1286],[1355,1393,1269],[1401,1423,941],[1274,1271,1384],[860,1378,1367],[715,1364,1355],[677,1406,869],[1297,1358,1202],[1388,1258,1329],[1180,1288,1266],[1008,583,880],[1524,1425,1463],[1390,1403,1387],[1278,1379,1247],[1278,1247,1285],[964,1278,1262],[1358,1369,1202],[1715,1699,1726],[926,1241,1414],[1341,1572,1479],[926,930,916],[1397,51,781],[409,1358,1297],[1236,436,301],[1376,677,869],[1351,1355,1356],[758,1534,1523],[1378,1357,1367],[977,1211,1365],[1135,1136,854],[1394,1391,1295],[1266,1260,1222],[1365,1302,1246],[1232,877,844],[736,930,864],[1408,1358,409],[1508,817,1523],[1381,1385,1368],[718,854,910],[854,718,1135],[1382,1222,1350],[1391,1211,1287],[1391,1287,1295],[1257,1651,134],[1414,1284,864],[1291,1369,1315],[1202,928,1313],[86,1400,1413],[1413,1200,86],[1263,1625,1031],[1413,1400,1404],[1002,1664,1834],[930,926,1414],[1399,1257,134],[520,316,596],[1393,1274,1208],[1657,1655,1712],[1407,1404,1400],[1404,1410,1413],[1649,1229,1406],[1362,1266,1222],[1384,1271,1175],[900,1376,1311],[1274,1384,1291],[1291,1384,1431],[1433,1396,1436],[1267,1359,1354],[309,1353,703],[838,1319,1286],[1407,1410,1404],[441,1518,773],[1241,123,1428],[1622,1521,1224],[1217,1208,1172],[1130,793,1076],[425,1409,1481],[1481,1409,1533],[1303,1378,860],[1350,1408,1394],[1246,1651,977],[1289,1360,1364],[1727,1694,1623],[1417,1407,1533],[1417,1410,1407],[1406,1650,1649],[1319,134,1437],[1414,864,930],[1406,1229,1124],[1354,1359,860],[1433,769,1396],[1417,1533,1409],[1416,1413,1410],[1415,1416,1410],[95,1237,921],[1392,1254,1395],[1360,1359,1267],[1258,1290,1329],[1180,128,1389],[1420,1409,425],[1417,1418,1410],[1418,1415,1410],[1422,1077,1416],[1247,1350,1394],[37,43,1180],[1204,1315,1358],[1428,1383,1375],[1356,1355,1269],[1409,1418,1417],[1302,45,1246],[1421,1416,1415],[1421,1422,1416],[1422,1494,1077],[957,720,938],[1423,1409,1420],[1423,1418,1409],[752,434,1438],[1260,1358,1408],[1363,1385,785],[1423,1426,1418],[1426,1424,1418],[1229,1649,1124],[1222,1260,1350],[1508,1523,1137],[1278,1285,769],[1482,917,144],[1418,1424,1415],[1425,1422,1421],[1425,1524,1422],[1272,1388,1390],[1391,409,1313],[1378,1366,1381],[1371,483,1361],[720,1262,1278],[29,103,159],[1271,1364,1267],[1424,1427,1415],[1537,1522,1518],[134,752,1438],[1420,934,941],[1428,1375,1284],[1277,1224,1831],[1362,1180,1266],[1401,1426,1423],[1577,1369,1291],[268,483,262],[1383,1450,1456],[1384,1175,1431],[1430,1415,1427],[1430,1421,1415],[1430,1425,1421],[1379,1382,1247],[1252,1553,1429],[1206,1392,1395],[1433,1430,1427],[309,208,1353],[1272,1390,1254],[1361,483,1366],[1523,817,808],[1302,1254,1392],[1371,1361,1303],[1426,1435,1424],[1435,1433,1424],[1433,1427,1424],[720,769,1433],[796,1258,1388],[1590,1419,1268],[1289,1372,1371],[1305,1317,1509],[998,1372,1174],[40,1386,139],[1261,1354,703],[1364,1271,1274],[134,1438,1437],[1436,1319,1437],[1317,686,1509],[1484,932,1304],[1434,1432,1509],[1420,65,934],[931,930,736],[1367,1357,1309],[1372,1370,1371],[1204,1208,1315],[1426,938,1435],[1368,1363,1253],[1207,454,1190],[1302,1310,1272],[309,1377,390],[390,1377,1411],[1370,1372,998],[1411,1590,1148],[720,1433,1435],[1450,1383,1428],[1379,678,1382],[1405,678,1379],[1208,1291,1315],[1399,134,1319],[1367,1309,1373],[1373,1352,1276],[596,741,593],[553,1264,612],[1433,1436,1430],[1437,1438,1430],[964,1405,1379],[1373,1309,1352],[1265,1403,1390],[1233,1618,1434],[1365,1310,1302],[789,796,1365],[720,1435,938],[128,139,1389],[1466,933,1525],[1191,1640,1637],[1314,1442,943],[1141,353,1323],[1489,1138,1474],[1462,1477,1440],[1474,1138,1488],[1442,1314,1443],[1446,1030,1546],[1484,1145,697],[1549,1443,1445],[1470,1572,1468],[1397,1239,1507],[1649,1825,1824],[1259,1440,1477],[1451,1450,1449],[978,1446,652],[1454,1456,1451],[1451,1456,1450],[341,1507,595],[933,1547,79],[804,1452,1060],[1454,1455,1456],[1398,1460,1454],[1455,877,1456],[1277,1831,1825],[804,1060,1458],[1339,1459,1595],[1314,1104,1443],[933,1448,1547],[147,1460,1398],[1460,1461,1454],[1454,1461,1455],[1292,1125,1464],[417,1531,1480],[1459,1339,1325],[811,1756,335],[1512,936,1490],[777,1529,1098],[147,1475,1460],[1464,253,1459],[836,855,482],[1487,1486,1307],[1104,1501,1443],[1439,1200,1532],[1475,1469,1460],[1460,1469,1461],[1325,1464,1459],[1277,1825,1649],[1532,1200,1077],[844,877,1455],[1572,933,1466],[1479,568,973],[1509,335,1305],[1339,1595,1759],[1469,1476,1461],[1461,1476,1455],[1104,1470,1468],[1464,1472,253],[1117,1091,1407],[1756,1542,335],[1206,1395,1188],[335,1542,1330],[835,844,1455],[1471,1598,1462],[1491,1442,1441],[835,1455,1476],[1441,1442,1443],[1489,1474,1473],[1251,1236,1250],[1030,1452,1477],[1598,1439,1532],[978,1598,1492],[1426,1401,938],[1448,1584,1482],[1724,1497,1475],[1475,1497,1469],[1484,1535,932],[1307,1486,1113],[1487,696,1495],[1037,1491,1441],[1030,1446,936],[1453,1487,1495],[696,1467,1495],[1138,1489,1483],[1497,1143,1469],[1469,1143,1476],[652,1598,978],[850,1043,1150],[1482,1584,1320],[1731,98,1697],[1113,1554,1573],[1524,1532,1494],[1496,1467,696],[1452,1259,1477],[296,1504,1497],[1504,1143,1497],[1143,1499,1476],[718,910,1498],[868,1540,1528],[817,1253,810],[1490,696,1487],[1440,1491,1037],[1510,676,595],[1488,1492,1517],[781,1239,1397],[1467,1519,1503],[1500,1307,1759],[1149,397,452],[1504,1514,1143],[1514,842,1143],[1125,733,1458],[1503,1531,1555],[1276,1036,1137],[1440,723,1123],[1036,1508,1137],[817,1508,1253],[103,883,1112],[1458,731,1472],[1512,1490,1487],[1487,1453,1486],[1138,978,1488],[1036,1253,1508],[1398,149,147],[1474,1517,1513],[1125,1458,1472],[1486,1453,1554],[1518,1534,758],[345,1058,1062],[928,1202,1369],[1554,1541,1505],[1464,1125,1472],[1504,764,1514],[304,426,573],[1505,742,1506],[1479,1572,1478],[1519,1483,1489],[833,716,1069],[1522,1534,1518],[1115,1513,777],[811,335,1432],[1591,1533,1407],[777,1517,1529],[1513,1517,777],[1498,910,1397],[1069,1539,833],[833,1539,1537],[1522,1551,1534],[1534,1551,1523],[1538,1137,1523],[910,51,1397],[1367,1373,703],[1466,1525,1468],[157,1186,1832],[1429,1511,1506],[1573,1505,1506],[1259,1452,804],[1503,1495,1467],[262,483,780],[1572,1466,1468],[1536,1556,716],[716,1556,1069],[1544,1523,1551],[1544,1538,1523],[1511,1573,1506],[933,1572,1448],[1543,1537,1539],[1537,1543,1522],[1091,933,79],[1519,1540,1545],[1549,1445,86],[1069,1548,1539],[1548,1543,1539],[1543,1551,1522],[1500,1487,1307],[68,784,1186],[1552,1544,1551],[1550,1538,1544],[1538,1550,1137],[1519,1473,1540],[1547,1448,1482],[1560,1563,1536],[1536,1563,1556],[1556,1548,1069],[1543,1558,1551],[1137,1550,1276],[1453,1495,1555],[1561,1543,1548],[1543,1561,1558],[1558,1566,1551],[1552,1550,1544],[1569,1557,1550],[1557,1276,1550],[1276,1557,254],[1531,1503,1480],[1535,1530,1510],[1545,1503,1519],[1547,1482,79],[1566,1552,1551],[1552,1569,1550],[1503,1545,1480],[703,1377,309],[1625,675,756],[1037,1441,88],[929,254,1557],[849,1567,1560],[1556,1564,1548],[1492,1529,1517],[1252,1429,1506],[1553,1027,1429],[1453,1555,1541],[1554,1453,1541],[1233,686,1553],[1328,1104,1314],[1564,1576,1548],[1548,1576,1561],[1557,1562,929],[1520,112,1668],[1483,1446,1138],[778,1570,1567],[1563,1564,1556],[1561,1565,1558],[1565,1566,1558],[1569,1552,1566],[1562,1557,1569],[1530,1535,1484],[1387,1402,1395],[1621,1634,1387],[1567,1568,1560],[1560,1568,1563],[1571,1569,1566],[1344,1330,1542],[1577,1431,1353],[1638,233,304],[1524,1463,1529],[1353,1431,1175],[1077,1200,1413],[1478,1470,1104],[1568,1575,1563],[1563,1575,1564],[1575,1576,1564],[1561,1576,1565],[1565,1574,1566],[1562,1515,929],[1555,96,1541],[1531,417,96],[1555,1531,96],[1246,45,1651],[208,1577,1353],[1586,1568,1567],[1574,1571,1566],[1571,1583,1569],[1474,1513,1528],[1239,1322,1535],[1478,1572,1470],[1570,1586,1567],[1488,1517,1474],[8,1833,1837],[1123,1442,1491],[1589,1568,1586],[1576,1594,1565],[1565,1594,1574],[1562,198,1515],[1559,1441,1549],[1441,1443,1549],[1135,425,1481],[1239,1535,1507],[1595,1487,1500],[1570,1585,1586],[1589,1578,1568],[1568,1578,1575],[1579,1569,1583],[1177,1577,208],[115,1236,110],[1578,1593,1575],[1587,1576,1575],[1576,1581,1594],[1571,1582,1583],[1588,1579,1583],[1579,1580,1562],[1569,1579,1562],[1562,1580,198],[1027,1511,1429],[1589,1593,1578],[1587,1581,1576],[1582,1574,1594],[1574,1582,1571],[1575,1593,1587],[1583,1582,1588],[1580,1590,198],[1587,1593,1581],[1505,1541,96],[1369,1577,1177],[1573,1554,1505],[1479,1478,568],[1585,1589,1586],[1369,1177,704],[766,1584,1334],[977,1257,1059],[1091,1591,1407],[1591,1091,1457],[1585,1604,1589],[1581,1592,1594],[1602,1582,1594],[1582,1608,1588],[1608,1579,1588],[1579,1597,1580],[1419,1590,1580],[1597,1419,1580],[1431,1577,1291],[1589,1604,1593],[1601,1596,1593],[1593,1596,1581],[1306,1511,1027],[1511,1113,1573],[1786,1412,1585],[1412,1604,1585],[1581,1596,1592],[1592,1602,1594],[1608,1599,1579],[1599,1611,1579],[1579,1611,1597],[1512,1487,253],[1519,1489,1473],[1545,1540,868],[1083,1187,1402],[1117,1407,1400],[1292,733,1125],[284,1240,1245],[1604,1600,1593],[1600,1601,1593],[1582,1607,1608],[789,1369,704],[1467,1483,1519],[1601,1613,1596],[1596,1613,1592],[1602,1607,1582],[1620,1553,1252],[1601,1605,1613],[1592,1613,1602],[1602,1606,1607],[1608,1609,1599],[1599,1609,1611],[1603,1597,1611],[1265,1419,1597],[1603,1265,1597],[1392,1206,45],[928,1369,789],[1474,1528,1473],[1104,1468,1501],[1412,1521,1604],[1613,1631,1602],[1607,1610,1608],[1608,1610,1609],[1476,863,835],[1495,1503,1555],[1498,1397,718],[1520,1668,7],[1604,1615,1600],[1605,1601,1600],[1602,1631,1606],[1606,1610,1607],[1759,1595,1500],[1292,1298,733],[1615,1604,1521],[1609,1603,1611],[652,1462,1598],[1468,1525,1445],[1443,1501,1445],[1134,1723,150],[1521,1622,1615],[1615,1616,1600],[1616,1605,1600],[1605,1616,1612],[1605,1612,1613],[1612,1617,1613],[1613,1617,1631],[1606,1614,1610],[1265,1603,1403],[448,417,1480],[1595,253,1487],[1501,1468,1445],[1383,1456,877],[1490,1496,696],[1610,1627,1609],[1627,1621,1609],[1591,1481,1533],[1598,1471,1439],[1353,1261,703],[1606,1631,1614],[1609,1621,1403],[1532,1077,1494],[1528,1115,513],[1546,652,1446],[1211,928,1365],[1540,1473,1528],[1078,1502,1787],[1425,1430,1438],[1617,1630,1631],[959,749,944],[566,570,603],[1716,310,1521],[775,452,397],[1615,1636,1616],[1616,1636,1612],[1610,1632,1627],[789,704,1258],[1457,1481,1591],[1769,1756,811],[207,1629,722],[1629,1625,722],[1224,1277,1622],[1622,1636,1615],[1636,1646,1612],[1612,1630,1617],[1631,1626,1614],[1614,1632,1610],[1506,104,95],[1481,1457,1136],[1123,943,1442],[936,1446,1496],[1499,863,1476],[1629,1031,1625],[1233,1509,686],[1633,1634,1621],[1621,1387,1403],[1472,1512,253],[1177,208,704],[1277,1636,1622],[1626,1632,1614],[1627,1633,1621],[936,1496,1490],[185,1454,1451],[731,936,1512],[1638,1635,207],[553,1263,1264],[1653,1212,1639],[1633,1627,1632],[1633,1387,1634],[1458,1060,731],[368,1307,1113],[1264,1031,1629],[1152,850,1150],[1277,1644,1636],[1646,1637,1612],[1637,1630,1612],[1647,1631,1630],[1647,1626,1631],[1422,1524,1494],[1030,652,1546],[1635,1629,207],[1635,1264,1629],[1639,1646,1636],[1637,1640,1630],[1641,1632,1626],[1632,1642,1633],[1633,1643,1387],[842,1499,1143],[865,863,1499],[1516,978,1492],[67,1130,784],[1103,1505,96],[88,1441,1200],[1644,1639,1636],[1640,1647,1630],[1647,1641,1626],[1633,1648,1643],[1492,1532,1524],[1488,1516,1492],[1037,1471,1462],[612,1264,1635],[1502,1078,1124],[1641,1642,1632],[1648,1633,1642],[1528,513,868],[1492,1598,1532],[1095,991,760],[679,157,1664],[760,1128,1785],[1277,1650,1644],[320,1022,244],[1559,1549,86],[1676,1520,7],[1488,978,1516],[1095,760,1785],[1128,384,1120],[304,312,1638],[1081,1638,312],[1081,1635,1638],[103,612,1635],[652,1477,1462],[1650,1645,1644],[1645,1639,1644],[1639,1637,1646],[1640,1090,1647],[1654,1641,1647],[1654,1642,1641],[1654,1648,1642],[1643,1402,1387],[1432,335,1509],[384,1128,760],[1652,312,304],[103,1243,612],[1277,1649,1650],[1090,1654,1647],[1643,1648,1402],[1134,324,1675],[679,68,157],[1652,1081,312],[1136,301,803],[1653,1639,1645],[723,1440,1259],[803,854,1136],[104,1506,742],[1112,159,103],[1654,1083,1648],[977,1651,1257],[1397,1507,718],[1081,103,1635],[1650,677,1645],[1083,1402,1648],[1706,1655,1671],[1624,1704,1711],[767,2,1],[608,794,294],[1678,1683,1686],[767,1682,2],[1669,1692,1675],[296,1681,764],[1671,1656,1672],[17,1673,1679],[1706,1671,1673],[1662,1674,1699],[1655,1657,1656],[418,84,915],[1526,1514,764],[1658,1657,567],[870,1695,764],[813,1697,98],[1659,821,5],[60,1013,848],[1013,110,1213],[661,1038,1692],[1660,1703,17],[1693,1673,17],[1663,1715,1743],[1013,115,110],[344,1733,32],[1670,1663,1743],[1670,1743,1738],[1677,1670,1738],[1661,4,3],[1084,1683,1678],[1728,793,1130],[1683,1767,1196],[1677,1738,1196],[1279,1786,853],[294,1038,608],[1279,1689,1786],[870,18,1708],[870,1680,1695],[1705,10,1670],[1084,1767,1683],[1196,1738,1686],[1750,870,1681],[1750,18,870],[1773,1703,1660],[1135,47,425],[150,323,1134],[1707,1655,1706],[1741,344,1687],[1685,1691,1684],[1684,1691,802],[1672,1656,0],[1038,124,608],[1671,1672,1690],[1628,1218,1767],[1686,1275,1667],[1493,1750,1681],[1773,18,1750],[1773,1660,18],[1679,1671,16],[1735,1706,1673],[1667,1678,1686],[1688,1658,1],[1656,1688,0],[1293,1281,1458],[1698,1678,1667],[1696,1130,1722],[1698,1667,1696],[1715,1662,1699],[1692,1038,294],[1682,767,357],[1669,661,1692],[802,1702,824],[1028,1067,1784],[822,1624,778],[119,813,861],[1218,1670,1677],[1703,1693,17],[1658,1710,1],[750,1730,1729],[1701,750,1729],[1693,1735,1673],[1731,1694,98],[1691,1702,802],[783,1729,1719],[1680,870,1708],[1707,1709,1655],[533,756,675],[1691,1210,1702],[11,1705,1670],[1767,1218,1196],[1218,1677,1196],[1664,1716,1721],[1729,1725,1719],[1729,1072,1725],[1210,1116,1702],[1702,1720,824],[1682,1661,2],[1713,1719,1721],[1716,1786,1713],[1730,1722,1072],[294,1717,1811],[1692,294,1666],[1659,680,821],[824,1720,1714],[1726,1731,1718],[345,1062,1045],[1738,1743,1275],[1075,1089,1071],[783,1719,1689],[1275,684,1728],[1692,1666,1665],[1675,1692,1665],[294,1811,1666],[1716,1664,310],[1678,1698,1700],[6,9,1727],[676,649,595],[381,31,361],[1723,1804,1772],[1727,9,1694],[1720,1089,1714],[1786,1716,1412],[1683,1196,1686],[1718,1697,1085],[1116,1739,1702],[1739,1734,1720],[1702,1739,1720],[1089,1720,1734],[509,748,1745],[1743,1715,1726],[1717,294,794],[1116,1732,1739],[1718,1731,1697],[1696,1667,1130],[1134,1665,1723],[1694,712,98],[101,1687,102],[391,1736,101],[662,636,642],[1734,1447,1089],[1089,1447,1071],[436,99,493],[1689,1279,783],[1485,1465,1342],[1736,1687,101],[344,1741,1733],[1741,1742,1733],[1735,829,1706],[829,1707,1706],[1485,1332,1465],[952,1126,1742],[1747,1447,1734],[879,892,645],[1730,1146,1696],[829,1709,1707],[1709,1712,1655],[118,1739,1732],[1332,1744,1465],[1687,1749,1741],[1741,1758,1742],[679,1072,68],[1072,1722,68],[118,1747,1739],[1747,1734,1739],[1465,1744,1736],[1736,1740,1687],[1704,1701,783],[1665,624,1723],[1722,1130,67],[1025,1055,467],[1444,14,1701],[558,522,530],[1657,1658,1688],[1339,1746,1332],[1332,1748,1744],[1687,1740,1749],[1741,1749,1758],[1109,952,1742],[1747,118,141],[1671,1690,1628],[1671,1628,16],[1657,1688,1656],[1745,748,1447],[357,767,1710],[1746,1748,1332],[1146,1700,1698],[1759,1307,1338],[1239,781,1322],[1745,1447,1747],[522,1745,1747],[316,717,595],[148,1493,1724],[1758,1109,1742],[1725,1072,679],[726,719,1661],[1695,1680,1526],[1772,1750,1493],[148,1772,1493],[1542,1751,1101],[952,1109,1086],[1744,1752,1736],[1736,1752,1740],[1753,1755,1740],[391,1342,1736],[821,112,1520],[557,530,1747],[530,522,1747],[994,879,645],[1542,1756,1751],[1813,1693,1703],[1746,1754,1748],[1748,1764,1744],[1752,1757,1740],[1740,1757,1753],[1749,1740,1755],[1755,1763,1749],[1763,1758,1749],[1275,1743,684],[1813,1735,1693],[1107,1099,1101],[1723,624,1804],[1403,1603,1609],[1748,1754,1764],[1744,1757,1752],[1760,1109,1758],[1465,1736,1342],[436,115,99],[1686,1738,1275],[1751,1766,1101],[1759,1754,1746],[1755,1753,1763],[1570,1279,853],[1701,1146,750],[1655,1656,1671],[11,1670,1218],[1761,1751,1756],[1766,1107,1101],[1726,1623,1731],[1711,1704,1279],[67,784,68],[558,530,545],[1620,1618,1233],[1769,1761,1756],[102,1687,344],[1338,1754,1759],[1754,232,1764],[1744,1765,1757],[1757,1763,1753],[1762,1760,1758],[1760,1771,1109],[1339,1759,1746],[1675,1665,1134],[1730,1696,1722],[1774,1751,1761],[1766,1780,1107],[1780,1105,1107],[1764,1765,1744],[1763,1762,1758],[1772,1773,1750],[1811,1813,1703],[1434,1769,1432],[1780,1766,1751],[232,1781,1764],[1711,1279,1570],[1688,1,0],[1774,1780,1751],[1764,1781,1765],[1765,1768,1757],[1757,1768,1763],[1777,1782,1760],[1762,1777,1760],[1769,1774,1761],[1763,1777,1762],[1760,1782,1771],[232,1737,1781],[1768,1776,1763],[272,255,774],[1669,994,661],[1618,1769,1434],[1765,589,1768],[1770,1777,1763],[1701,1729,783],[1783,1774,1769],[1789,1780,1774],[589,1775,1768],[1776,1770,1763],[1782,1778,1771],[1771,1778,1070],[624,1703,1773],[624,1811,1703],[1620,1244,1618],[1779,1769,1618],[1779,1783,1769],[739,1735,1813],[1775,1776,1768],[1790,1777,1770],[1777,1778,1782],[1725,679,1721],[733,1293,1458],[1802,1618,1244],[1802,1779,1618],[1788,1783,1779],[1789,1774,1783],[1796,1780,1789],[1796,1119,1780],[1823,1817,325],[1699,1727,1623],[750,1146,1730],[1497,1724,296],[1128,1119,1796],[61,62,71],[1131,413,824],[1114,1111,249],[1784,1776,1775],[1123,723,1283],[1791,1788,1779],[1788,1789,1783],[1095,1797,1074],[1028,1784,1775],[1784,1770,1776],[1777,1790,1778],[1793,1797,1095],[1797,1800,1074],[1798,1790,1770],[1805,1802,1244],[1802,1791,1779],[1792,1789,1788],[1793,1785,1128],[1793,1095,1785],[1074,1800,1619],[741,457,593],[1798,1770,1784],[1798,1794,1790],[1786,1689,1713],[684,1726,1718],[1728,1085,793],[1795,1787,1502],[1806,1802,1805],[1819,1788,1791],[1067,1798,1784],[1790,1794,1778],[1795,1502,1124],[1801,1805,1787],[1807,1791,1802],[1807,1819,1791],[1819,1792,1788],[1799,1128,1796],[994,645,661],[684,1085,1728],[684,1718,1085],[1699,1623,1726],[1801,1787,1795],[1808,1789,1792],[1808,1796,1789],[1799,1793,1128],[1809,1797,1793],[1809,1803,1797],[1803,1800,1797],[1067,1794,1798],[774,255,1778],[1673,1671,1679],[879,1669,888],[19,1807,1802],[1810,1619,1800],[879,994,1669],[1794,774,1778],[1723,1772,148],[1804,1773,1772],[1814,1795,1124],[1649,1814,1124],[1814,1801,1795],[1812,1806,1805],[19,1802,1806],[19,1819,1807],[1810,1800,1803],[1804,624,1773],[1714,1131,824],[1801,1812,1805],[1812,19,1806],[1808,1792,1819],[1799,1809,1793],[1821,1810,1803],[1717,739,1813],[1061,1619,1822],[1794,1817,774],[79,1482,144],[1815,1801,1814],[23,1819,19],[589,1028,1775],[1817,1823,774],[1689,1719,1713],[1824,1814,1649],[1827,1818,1801],[1818,1812,1801],[1818,19,1812],[1818,20,19],[1816,1809,1799],[1821,1803,1809],[1822,1619,1810],[124,708,608],[1663,10,1715],[1815,1827,1801],[1820,1808,1819],[23,1820,1819],[603,1810,1821],[603,1822,1810],[1085,1697,793],[1628,1690,11],[1527,1704,1624],[1730,1072,1729],[1526,1444,1704],[1526,1680,1444],[1704,1444,1701],[1816,1821,1809],[1722,67,68],[317,272,1823],[1716,1713,1721],[16,1628,1767],[1527,1526,1704],[1824,1826,1814],[1814,1826,1815],[1818,21,20],[1835,1808,1820],[603,570,1822],[226,1070,1778],[1013,1181,1179],[1721,679,1664],[1717,1813,1811],[1828,1827,1815],[22,1820,23],[22,1835,1820],[1830,603,1821],[719,1659,5],[643,567,1657],[1717,794,739],[1825,1826,1824],[1828,1815,1826],[1829,21,1818],[1808,1835,13],[4,719,5],[10,1662,1715],[1828,1832,1827],[1832,1818,1827],[12,1833,1816],[1833,1821,1816],[1833,1830,1821],[14,1146,1701],[1186,1829,1818],[1280,603,1830],[14,1700,1146],[1667,1728,1130],[1825,1834,1826],[1834,1828,1826],[1832,1186,1818],[1836,13,1835],[1624,1711,1570],[778,1624,1570],[1719,1725,1721],[1002,1825,1831],[1002,1834,1825],[1834,1832,1828],[1186,21,1829],[1836,1835,22],[1837,1833,12],[1280,1830,1833],[1667,1275,1728],[16,1767,1084],[589,1765,1838],[1765,1781,1838],[1781,1737,1838],[1737,982,1838],[982,1053,1838],[1053,816,1838],[816,589,1838]]\n\n});\n\nrequire.define(\"/node_modules/meshdata/models/teapot.js\",function(require,module,exports,__dirname,__filename,process,global){exports.positions=[[5.929688,4.125,0],[5.387188,4.125,2.7475],[5.2971,4.494141,2.70917],[5.832031,4.494141,0],[5.401602,4.617188,2.753633],[5.945313,4.617188,0],[5.614209,4.494141,2.844092],[6.175781,4.494141,0],[5.848437,4.125,2.94375],[6.429688,4.125,0],[3.899688,4.125,4.97],[3.830352,4.494141,4.900664],[3.910782,4.617188,4.981094],[4.074414,4.494141,5.144727],[4.254687,4.125,5.325],[1.677188,4.125,6.4575],[1.638858,4.494141,6.367412],[1.68332,4.617188,6.471914],[1.77378,4.494141,6.684522],[1.873438,4.125,6.91875],[-1.070312,4.125,7],[-1.070312,4.494141,6.902344],[-1.070312,4.617188,7.015625],[-1.070312,4.494141,7.246094],[-1.070312,4.125,7.5],[-1.070312,4.125,7],[-4.007656,4.125,6.4575],[-3.859572,4.494141,6.367412],[-1.070312,4.494141,6.902344],[-3.847676,4.617188,6.471914],[-1.070312,4.617188,7.015625],[-3.917371,4.494141,6.684522],[-1.070312,4.494141,7.246094],[-4.014062,4.125,6.91875],[-1.070312,4.125,7.5],[-6.209063,4.125,4.97],[-6.042168,4.494141,4.900664],[-6.0725,4.617188,4.981094],[-6.217675,4.494141,5.144727],[-6.395312,4.125,5.325],[-7.591093,4.125,2.7475],[-7.464421,4.494141,2.70917],[-7.550137,4.617188,2.753633],[-7.755822,4.494141,2.844092],[-7.989062,4.125,2.94375],[-8.070313,4.125,0],[-7.972656,4.494141,0],[-8.085938,4.617188,0],[-8.316406,4.494141,0],[-8.570313,4.125,0],[-8.070313,4.125,0],[-7.527812,4.125,-2.7475],[-7.437724,4.494141,-2.70917],[-7.972656,4.494141,0],[-7.542227,4.617188,-2.753633],[-8.085938,4.617188,0],[-7.754834,4.494141,-2.844092],[-8.316406,4.494141,0],[-7.989062,4.125,-2.94375],[-8.570313,4.125,0],[-6.040312,4.125,-4.97],[-5.970977,4.494141,-4.900664],[-6.051406,4.617188,-4.981094],[-6.215039,4.494141,-5.144727],[-6.395312,4.125,-5.325],[-3.817812,4.125,-6.4575],[-3.779482,4.494141,-6.367412],[-3.823945,4.617188,-6.471914],[-3.914404,4.494141,-6.684522],[-4.014062,4.125,-6.91875],[-1.070312,4.125,-7],[-1.070312,4.494141,-6.902344],[-1.070312,4.617188,-7.015625],[-1.070312,4.494141,-7.246094],[-1.070312,4.125,-7.5],[-1.070312,4.125,-7],[1.677188,4.125,-6.4575],[1.638858,4.494141,-6.367412],[-1.070312,4.494141,-6.902344],[1.68332,4.617188,-6.471914],[-1.070312,4.617188,-7.015625],[1.77378,4.494141,-6.684522],[-1.070312,4.494141,-7.246094],[1.873438,4.125,-6.91875],[-1.070312,4.125,-7.5],[3.899688,4.125,-4.97],[3.830352,4.494141,-4.900664],[3.910782,4.617188,-4.981094],[4.074414,4.494141,-5.144727],[4.254687,4.125,-5.325],[5.387188,4.125,-2.7475],[5.2971,4.494141,-2.70917],[5.401602,4.617188,-2.753633],[5.614209,4.494141,-2.844092],[5.848437,4.125,-2.94375],[5.929688,4.125,0],[5.832031,4.494141,0],[5.945313,4.617188,0],[6.175781,4.494141,0],[6.429688,4.125,0],[6.429688,4.125,0],[5.848437,4.125,2.94375],[6.695264,2.162109,3.304053],[7.347656,2.162109,0],[7.433985,0.234375,3.61836],[8.148438,0.234375,0],[7.956494,-1.623047,3.840674],[8.714844,-1.623047,0],[8.154688,-3.375,3.925],[8.929688,-3.375,0],[4.254687,4.125,5.325],[4.906446,2.162109,5.976758],[5.475,0.234375,6.545312],[5.877149,-1.623047,6.947461],[6.029688,-3.375,7.1],[1.873438,4.125,6.91875],[2.23374,2.162109,7.765576],[2.548047,0.234375,8.504297],[2.770362,-1.623047,9.026807],[2.854688,-3.375,9.225],[-1.070312,4.125,7.5],[-1.070312,2.162109,8.417969],[-1.070312,0.234375,9.21875],[-1.070312,-1.623047,9.785156],[-1.070312,-3.375,10],[-1.070312,4.125,7.5],[-4.014062,4.125,6.91875],[-4.374365,2.162109,7.765576],[-1.070312,2.162109,8.417969],[-4.688672,0.234375,8.504297],[-1.070312,0.234375,9.21875],[-4.910986,-1.623047,9.026807],[-1.070312,-1.623047,9.785156],[-4.995313,-3.375,9.225],[-1.070312,-3.375,10],[-6.395312,4.125,5.325],[-7.047071,2.162109,5.976758],[-7.615624,0.234375,6.545312],[-8.017773,-1.623047,6.947461],[-8.170312,-3.375,7.1],[-7.989062,4.125,2.94375],[-8.835889,2.162109,3.304053],[-9.57461,0.234375,3.61836],[-10.097119,-1.623047,3.840674],[-10.295313,-3.375,3.925],[-8.570313,4.125,0],[-9.488281,2.162109,0],[-10.289063,0.234375,0],[-10.855469,-1.623047,0],[-11.070313,-3.375,0],[-8.570313,4.125,0],[-7.989062,4.125,-2.94375],[-8.835889,2.162109,-3.304053],[-9.488281,2.162109,0],[-9.57461,0.234375,-3.61836],[-10.289063,0.234375,0],[-10.097119,-1.623047,-3.840674],[-10.855469,-1.623047,0],[-10.295313,-3.375,-3.925],[-11.070313,-3.375,0],[-6.395312,4.125,-5.325],[-7.047071,2.162109,-5.976758],[-7.615624,0.234375,-6.545312],[-8.017773,-1.623047,-6.947461],[-8.170312,-3.375,-7.1],[-4.014062,4.125,-6.91875],[-4.374365,2.162109,-7.765576],[-4.688672,0.234375,-8.504297],[-4.910986,-1.623047,-9.026807],[-4.995313,-3.375,-9.225],[-1.070312,4.125,-7.5],[-1.070312,2.162109,-8.417969],[-1.070312,0.234375,-9.21875],[-1.070312,-1.623047,-9.785156],[-1.070312,-3.375,-10],[-1.070312,4.125,-7.5],[1.873438,4.125,-6.91875],[2.23374,2.162109,-7.765576],[-1.070312,2.162109,-8.417969],[2.548047,0.234375,-8.504297],[-1.070312,0.234375,-9.21875],[2.770362,-1.623047,-9.026807],[-1.070312,-1.623047,-9.785156],[2.854688,-3.375,-9.225],[-1.070312,-3.375,-10],[4.254687,4.125,-5.325],[4.906446,2.162109,-5.976758],[5.475,0.234375,-6.545312],[5.877149,-1.623047,-6.947461],[6.029688,-3.375,-7.1],[5.848437,4.125,-2.94375],[6.695264,2.162109,-3.304053],[7.433985,0.234375,-3.61836],[7.956494,-1.623047,-3.840674],[8.154688,-3.375,-3.925],[6.429688,4.125,0],[7.347656,2.162109,0],[8.148438,0.234375,0],[8.714844,-1.623047,0],[8.929688,-3.375,0],[8.929688,-3.375,0],[8.154688,-3.375,3.925],[7.794336,-4.857422,3.77168],[8.539063,-4.857422,0],[7.001562,-5.953125,3.434375],[7.679688,-5.953125,0],[6.208789,-6.697266,3.09707],[6.820313,-6.697266,0],[5.848437,-7.125,2.94375],[6.429688,-7.125,0],[6.029688,-3.375,7.1],[5.752343,-4.857422,6.822656],[5.142187,-5.953125,6.2125],[4.532031,-6.697266,5.602344],[4.254687,-7.125,5.325],[2.854688,-3.375,9.225],[2.701367,-4.857422,8.864649],[2.364063,-5.953125,8.071875],[2.026758,-6.697266,7.279101],[1.873438,-7.125,6.91875],[-1.070312,-3.375,10],[-1.070312,-4.857422,9.609375],[-1.070312,-5.953125,8.75],[-1.070312,-6.697266,7.890625],[-1.070312,-7.125,7.5],[-1.070312,-3.375,10],[-4.995313,-3.375,9.225],[-4.841992,-4.857422,8.864649],[-1.070312,-4.857422,9.609375],[-4.504687,-5.953125,8.071875],[-1.070312,-5.953125,8.75],[-4.167383,-6.697266,7.279101],[-1.070312,-6.697266,7.890625],[-4.014062,-7.125,6.91875],[-1.070312,-7.125,7.5],[-8.170312,-3.375,7.1],[-7.892968,-4.857422,6.822656],[-7.282812,-5.953125,6.2125],[-6.672656,-6.697266,5.602344],[-6.395312,-7.125,5.325],[-10.295313,-3.375,3.925],[-9.934961,-4.857422,3.77168],[-9.142187,-5.953125,3.434375],[-8.349414,-6.697266,3.09707],[-7.989062,-7.125,2.94375],[-11.070313,-3.375,0],[-10.679688,-4.857422,0],[-9.820313,-5.953125,0],[-8.960938,-6.697266,0],[-8.570313,-7.125,0],[-11.070313,-3.375,0],[-10.295313,-3.375,-3.925],[-9.934961,-4.857422,-3.77168],[-10.679688,-4.857422,0],[-9.142187,-5.953125,-3.434375],[-9.820313,-5.953125,0],[-8.349414,-6.697266,-3.09707],[-8.960938,-6.697266,0],[-7.989062,-7.125,-2.94375],[-8.570313,-7.125,0],[-8.170312,-3.375,-7.1],[-7.892968,-4.857422,-6.822656],[-7.282812,-5.953125,-6.2125],[-6.672656,-6.697266,-5.602344],[-6.395312,-7.125,-5.325],[-4.995313,-3.375,-9.225],[-4.841992,-4.857422,-8.864649],[-4.504687,-5.953125,-8.071875],[-4.167383,-6.697266,-7.279101],[-4.014062,-7.125,-6.91875],[-1.070312,-3.375,-10],[-1.070312,-4.857422,-9.609375],[-1.070312,-5.953125,-8.75],[-1.070312,-6.697266,-7.890625],[-1.070312,-7.125,-7.5],[-1.070312,-3.375,-10],[2.854688,-3.375,-9.225],[2.701367,-4.857422,-8.864649],[-1.070312,-4.857422,-9.609375],[2.364063,-5.953125,-8.071875],[-1.070312,-5.953125,-8.75],[2.026758,-6.697266,-7.279101],[-1.070312,-6.697266,-7.890625],[1.873438,-7.125,-6.91875],[-1.070312,-7.125,-7.5],[6.029688,-3.375,-7.1],[5.752343,-4.857422,-6.822656],[5.142187,-5.953125,-6.2125],[4.532031,-6.697266,-5.602344],[4.254687,-7.125,-5.325],[8.154688,-3.375,-3.925],[7.794336,-4.857422,-3.77168],[7.001562,-5.953125,-3.434375],[6.208789,-6.697266,-3.09707],[5.848437,-7.125,-2.94375],[8.929688,-3.375,0],[8.539063,-4.857422,0],[7.679688,-5.953125,0],[6.820313,-6.697266,0],[6.429688,-7.125,0],[6.429688,-7.125,0],[5.848437,-7.125,2.94375],[5.691685,-7.400391,2.877056],[6.259766,-7.400391,0],[4.853868,-7.640625,2.520586],[5.351563,-7.640625,0],[2.783648,-7.810547,1.639761],[3.107422,-7.810547,0],[-1.070312,-7.875,0],[4.254687,-7.125,5.325],[4.134043,-7.400391,5.204355],[3.489219,-7.640625,4.559531],[1.895879,-7.810547,2.966191],[-1.070312,-7.875,0],[1.873438,-7.125,6.91875],[1.806743,-7.400391,6.761997],[1.450274,-7.640625,5.92418],[0.569448,-7.810547,3.85396],[-1.070312,-7.875,0],[-1.070312,-7.125,7.5],[-1.070312,-7.400391,7.330078],[-1.070312,-7.640625,6.421875],[-1.070312,-7.810547,4.177734],[-1.070312,-7.875,0],[-1.070312,-7.125,7.5],[-4.014062,-7.125,6.91875],[-3.947368,-7.400391,6.761997],[-1.070312,-7.400391,7.330078],[-3.590898,-7.640625,5.92418],[-1.070312,-7.640625,6.421875],[-2.710073,-7.810547,3.85396],[-1.070312,-7.810547,4.177734],[-1.070312,-7.875,0],[-6.395312,-7.125,5.325],[-6.274668,-7.400391,5.204355],[-5.629844,-7.640625,4.559531],[-4.036504,-7.810547,2.966191],[-1.070312,-7.875,0],[-7.989062,-7.125,2.94375],[-7.832309,-7.400391,2.877056],[-6.994492,-7.640625,2.520586],[-4.924272,-7.810547,1.639761],[-1.070312,-7.875,0],[-8.570313,-7.125,0],[-8.400391,-7.400391,0],[-7.492188,-7.640625,0],[-5.248047,-7.810547,0],[-1.070312,-7.875,0],[-8.570313,-7.125,0],[-7.989062,-7.125,-2.94375],[-7.832309,-7.400391,-2.877056],[-8.400391,-7.400391,0],[-6.994492,-7.640625,-2.520586],[-7.492188,-7.640625,0],[-4.924272,-7.810547,-1.639761],[-5.248047,-7.810547,0],[-1.070312,-7.875,0],[-6.395312,-7.125,-5.325],[-6.274668,-7.400391,-5.204355],[-5.629844,-7.640625,-4.559531],[-4.036504,-7.810547,-2.966191],[-1.070312,-7.875,0],[-4.014062,-7.125,-6.91875],[-3.947368,-7.400391,-6.761997],[-3.590898,-7.640625,-5.92418],[-2.710073,-7.810547,-3.85396],[-1.070312,-7.875,0],[-1.070312,-7.125,-7.5],[-1.070312,-7.400391,-7.330078],[-1.070312,-7.640625,-6.421875],[-1.070312,-7.810547,-4.177734],[-1.070312,-7.875,0],[-1.070312,-7.125,-7.5],[1.873438,-7.125,-6.91875],[1.806743,-7.400391,-6.761997],[-1.070312,-7.400391,-7.330078],[1.450274,-7.640625,-5.92418],[-1.070312,-7.640625,-6.421875],[0.569448,-7.810547,-3.85396],[-1.070312,-7.810547,-4.177734],[-1.070312,-7.875,0],[4.254687,-7.125,-5.325],[4.134043,-7.400391,-5.204355],[3.489219,-7.640625,-4.559531],[1.895879,-7.810547,-2.966191],[-1.070312,-7.875,0],[5.848437,-7.125,-2.94375],[5.691685,-7.400391,-2.877056],[4.853868,-7.640625,-2.520586],[2.783648,-7.810547,-1.639761],[-1.070312,-7.875,0],[6.429688,-7.125,0],[6.259766,-7.400391,0],[5.351563,-7.640625,0],[3.107422,-7.810547,0],[-1.070312,-7.875,0],[-9.070313,2.25,0],[-8.992188,2.425781,0.84375],[-11.47583,2.405457,0.84375],[-11.40625,2.232422,0],[-13.298828,2.263184,0.84375],[-13.132813,2.109375,0],[-14.421631,1.877014,0.84375],[-14.203125,1.775391,0],[-14.804688,1.125,0.84375],[-14.570313,1.125,0],[-8.820313,2.8125,1.125],[-11.628906,2.786134,1.125],[-13.664063,2.601563,1.125],[-14.902344,2.100586,1.125],[-15.320313,1.125,1.125],[-8.648438,3.199219,0.84375],[-11.781982,3.166809,0.84375],[-14.029297,2.939941,0.84375],[-15.383057,2.324158,0.84375],[-15.835938,1.125,0.84375],[-8.570313,3.375,0],[-11.851563,3.339844,0],[-14.195313,3.09375,0],[-15.601563,2.425781,0],[-16.070313,1.125,0],[-8.570313,3.375,0],[-8.648438,3.199219,-0.84375],[-11.781982,3.166809,-0.84375],[-11.851563,3.339844,0],[-14.029297,2.939941,-0.84375],[-14.195313,3.09375,0],[-15.383057,2.324158,-0.84375],[-15.601563,2.425781,0],[-15.835938,1.125,-0.84375],[-16.070313,1.125,0],[-8.820313,2.8125,-1.125],[-11.628906,2.786134,-1.125],[-13.664063,2.601563,-1.125],[-14.902344,2.100586,-1.125],[-15.320313,1.125,-1.125],[-8.992188,2.425781,-0.84375],[-11.47583,2.405457,-0.84375],[-13.298828,2.263184,-0.84375],[-14.421631,1.877014,-0.84375],[-14.804688,1.125,-0.84375],[-9.070313,2.25,0],[-11.40625,2.232422,0],[-13.132813,2.109375,0],[-14.203125,1.775391,0],[-14.570313,1.125,0],[-14.570313,1.125,0],[-14.804688,1.125,0.84375],[-14.588013,0.00705,0.84375],[-14.375,0.105469,0],[-13.90918,-1.275146,0.84375],[-13.757813,-1.125,0],[-12.724976,-2.540863,0.84375],[-12.671875,-2.355469,0],[-10.992188,-3.609375,0.84375],[-11.070313,-3.375,0],[-15.320313,1.125,1.125],[-15.056641,-0.209473,1.125],[-14.242188,-1.605469,1.125],[-12.841797,-2.94873,1.125],[-10.820313,-4.125,1.125],[-15.835938,1.125,0.84375],[-15.525269,-0.425995,0.84375],[-14.575195,-1.935791,0.84375],[-12.958618,-3.356598,0.84375],[-10.648438,-4.640625,0.84375],[-16.070313,1.125,0],[-15.738281,-0.524414,0],[-14.726563,-2.085938,0],[-13.011719,-3.541992,0],[-10.570313,-4.875,0],[-16.070313,1.125,0],[-15.835938,1.125,-0.84375],[-15.525269,-0.425995,-0.84375],[-15.738281,-0.524414,0],[-14.575195,-1.935791,-0.84375],[-14.726563,-2.085938,0],[-12.958618,-3.356598,-0.84375],[-13.011719,-3.541992,0],[-10.648438,-4.640625,-0.84375],[-10.570313,-4.875,0],[-15.320313,1.125,-1.125],[-15.056641,-0.209473,-1.125],[-14.242188,-1.605469,-1.125],[-12.841797,-2.94873,-1.125],[-10.820313,-4.125,-1.125],[-14.804688,1.125,-0.84375],[-14.588013,0.00705,-0.84375],[-13.90918,-1.275146,-0.84375],[-12.724976,-2.540863,-0.84375],[-10.992188,-3.609375,-0.84375],[-14.570313,1.125,0],[-14.375,0.105469,0],[-13.757813,-1.125,0],[-12.671875,-2.355469,0],[-11.070313,-3.375,0],[7.429688,-0.75,0],[7.429688,-1.394531,1.85625],[10.01123,-0.677124,1.676074],[9.828125,-0.199219,0],[11.101563,0.84668,1.279688],[10.867188,1.125,0],[11.723145,2.629761,0.883301],[11.4375,2.730469,0],[12.898438,4.125,0.703125],[12.429688,4.125,0],[7.429688,-2.8125,2.475],[10.414063,-1.728516,2.234766],[11.617188,0.234375,1.70625],[12.351563,2.408203,1.177734],[13.929688,4.125,0.9375],[7.429688,-4.230469,1.85625],[10.816895,-2.779907,1.676074],[12.132813,-0.37793,1.279688],[12.97998,2.186646,0.883301],[14.960938,4.125,0.703125],[7.429688,-4.875,0],[11,-3.257813,0],[12.367188,-0.65625,0],[13.265625,2.085938,0],[15.429688,4.125,0],[7.429688,-4.875,0],[7.429688,-4.230469,-1.85625],[10.816895,-2.779907,-1.676074],[11,-3.257813,0],[12.132813,-0.37793,-1.279688],[12.367188,-0.65625,0],[12.97998,2.186646,-0.883301],[13.265625,2.085938,0],[14.960938,4.125,-0.703125],[15.429688,4.125,0],[7.429688,-2.8125,-2.475],[10.414063,-1.728516,-2.234766],[11.617188,0.234375,-1.70625],[12.351563,2.408203,-1.177734],[13.929688,4.125,-0.9375],[7.429688,-1.394531,-1.85625],[10.01123,-0.677124,-1.676074],[11.101563,0.84668,-1.279688],[11.723145,2.629761,-0.883301],[12.898438,4.125,-0.703125],[7.429688,-0.75,0],[9.828125,-0.199219,0],[10.867188,1.125,0],[11.4375,2.730469,0],[12.429688,4.125,0],[12.429688,4.125,0],[12.898438,4.125,0.703125],[13.291077,4.346237,0.65918],[12.789063,4.335938,0],[13.525879,4.422729,0.5625],[13.054688,4.40625,0],[13.532898,4.350357,0.46582],[13.132813,4.335938,0],[13.242188,4.125,0.421875],[12.929688,4.125,0],[13.929688,4.125,0.9375],[14.395508,4.368896,0.878906],[14.5625,4.458984,0.75],[14.413086,4.38208,0.621094],[13.929688,4.125,0.5625],[14.960938,4.125,0.703125],[15.499939,4.391556,0.65918],[15.599121,4.495239,0.5625],[15.293274,4.413804,0.46582],[14.617188,4.125,0.421875],[15.429688,4.125,0],[16.001953,4.401855,0],[16.070313,4.511719,0],[15.693359,4.428224,0],[14.929688,4.125,0],[15.429688,4.125,0],[14.960938,4.125,-0.703125],[15.499939,4.391556,-0.65918],[16.001953,4.401855,0],[15.599121,4.495239,-0.5625],[16.070313,4.511719,0],[15.293274,4.413804,-0.46582],[15.693359,4.428224,0],[14.617188,4.125,-0.421875],[14.929688,4.125,0],[13.929688,4.125,-0.9375],[14.395508,4.368896,-0.878906],[14.5625,4.458984,-0.75],[14.413086,4.38208,-0.621094],[13.929688,4.125,-0.5625],[12.898438,4.125,-0.703125],[13.291077,4.346237,-0.65918],[13.525879,4.422729,-0.5625],[13.532898,4.350357,-0.46582],[13.242188,4.125,-0.421875],[12.429688,4.125,0],[12.789063,4.335938,0],[13.054688,4.40625,0],[13.132813,4.335938,0],[12.929688,4.125,0],[0.501414,7.628906,0.670256],[0.632813,7.628906,0],[-1.070312,7.875,0],[0.429278,7.03125,0.639395],[0.554688,7.03125,0],[-0.162029,6.292969,0.38696],[-0.085937,6.292969,0],[-0.147812,5.625,0.3925],[-0.070312,5.625,0],[0.140489,7.628906,1.210801],[-1.070312,7.875,0],[0.084844,7.03125,1.155156],[-0.370879,6.292969,0.699434],[-0.360312,5.625,0.71],[-0.400056,7.628906,1.571726],[-1.070312,7.875,0],[-0.430918,7.03125,1.49959],[-0.683352,6.292969,0.908284],[-0.677812,5.625,0.9225],[-1.070312,7.628906,1.703125],[-1.070312,7.875,0],[-1.070312,7.03125,1.625],[-1.070312,6.292969,0.984375],[-1.070312,5.625,1],[-1.740569,7.628906,1.571726],[-1.070312,7.628906,1.703125],[-1.070312,7.875,0],[-1.709707,7.03125,1.49959],[-1.070312,7.03125,1.625],[-1.457273,6.292969,0.908284],[-1.070312,6.292969,0.984375],[-1.462812,5.625,0.9225],[-1.070312,5.625,1],[-2.281113,7.628906,1.210801],[-1.070312,7.875,0],[-2.225469,7.03125,1.155156],[-1.769746,6.292969,0.699434],[-1.780312,5.625,0.71],[-2.642038,7.628906,0.670256],[-1.070312,7.875,0],[-2.569902,7.03125,0.639395],[-1.978596,6.292969,0.38696],[-1.992812,5.625,0.3925],[-2.773438,7.628906,0],[-1.070312,7.875,0],[-2.695313,7.03125,0],[-2.054687,6.292969,0],[-2.070312,5.625,0],[-2.642038,7.628906,-0.670256],[-2.773438,7.628906,0],[-1.070312,7.875,0],[-2.569902,7.03125,-0.639395],[-2.695313,7.03125,0],[-1.978596,6.292969,-0.38696],[-2.054687,6.292969,0],[-1.992812,5.625,-0.3925],[-2.070312,5.625,0],[-2.281113,7.628906,-1.210801],[-1.070312,7.875,0],[-2.225469,7.03125,-1.155156],[-1.769746,6.292969,-0.699434],[-1.780312,5.625,-0.71],[-1.740569,7.628906,-1.571726],[-1.070312,7.875,0],[-1.709707,7.03125,-1.49959],[-1.457273,6.292969,-0.908284],[-1.462812,5.625,-0.9225],[-1.070312,7.628906,-1.703125],[-1.070312,7.875,0],[-1.070312,7.03125,-1.625],[-1.070312,6.292969,-0.984375],[-1.070312,5.625,-1],[-0.400056,7.628906,-1.571726],[-1.070312,7.628906,-1.703125],[-1.070312,7.875,0],[-0.430918,7.03125,-1.49959],[-1.070312,7.03125,-1.625],[-0.683352,6.292969,-0.908284],[-1.070312,6.292969,-0.984375],[-0.677812,5.625,-0.9225],[-1.070312,5.625,-1],[0.140489,7.628906,-1.210801],[-1.070312,7.875,0],[0.084844,7.03125,-1.155156],[-0.370879,6.292969,-0.699434],[-0.360312,5.625,-0.71],[0.501414,7.628906,-0.670256],[-1.070312,7.875,0],[0.429278,7.03125,-0.639395],[-0.162029,6.292969,-0.38696],[-0.147812,5.625,-0.3925],[0.632813,7.628906,0],[-1.070312,7.875,0],[0.554688,7.03125,0],[-0.085937,6.292969,0],[-0.070312,5.625,0],[-0.070312,5.625,0],[-0.147812,5.625,0.3925],[1.034141,5.179688,0.895391],[1.210938,5.179688,0],[2.735,4.875,1.619062],[3.054688,4.875,0],[4.262891,4.570313,2.26914],[4.710938,4.570313,0],[4.925938,4.125,2.55125],[5.429688,4.125,0],[-0.360312,5.625,0.71],[0.549375,5.179688,1.619688],[1.858438,4.875,2.92875],[3.034375,4.570313,4.104687],[3.544688,4.125,4.615],[-0.677812,5.625,0.9225],[-0.174922,5.179688,2.104453],[0.54875,4.875,3.805313],[1.198828,4.570313,5.333203],[1.480938,4.125,5.99625],[-1.070312,5.625,1],[-1.070312,5.179688,2.28125],[-1.070312,4.875,4.125],[-1.070312,4.570313,5.78125],[-1.070312,4.125,6.5],[-1.070312,5.625,1],[-1.462812,5.625,0.9225],[-1.965703,5.179688,2.104453],[-1.070312,5.179688,2.28125],[-2.689375,4.875,3.805313],[-1.070312,4.875,4.125],[-3.339453,4.570313,5.333203],[-1.070312,4.570313,5.78125],[-3.621562,4.125,5.99625],[-1.070312,4.125,6.5],[-1.780312,5.625,0.71],[-2.69,5.179688,1.619688],[-3.999062,4.875,2.92875],[-5.174999,4.570313,4.104687],[-5.685312,4.125,4.615],[-1.992812,5.625,0.3925],[-3.174765,5.179688,0.895391],[-4.875625,4.875,1.619062],[-6.403516,4.570313,2.26914],[-7.066563,4.125,2.55125],[-2.070312,5.625,0],[-3.351562,5.179688,0],[-5.195313,4.875,0],[-6.851563,4.570313,0],[-7.570313,4.125,0],[-2.070312,5.625,0],[-1.992812,5.625,-0.3925],[-3.174765,5.179688,-0.895391],[-3.351562,5.179688,0],[-4.875625,4.875,-1.619062],[-5.195313,4.875,0],[-6.403516,4.570313,-2.26914],[-6.851563,4.570313,0],[-7.066563,4.125,-2.55125],[-7.570313,4.125,0],[-1.780312,5.625,-0.71],[-2.69,5.179688,-1.619688],[-3.999062,4.875,-2.92875],[-5.174999,4.570313,-4.104687],[-5.685312,4.125,-4.615],[-1.462812,5.625,-0.9225],[-1.965703,5.179688,-2.104453],[-2.689375,4.875,-3.805313],[-3.339453,4.570313,-5.333203],[-3.621562,4.125,-5.99625],[-1.070312,5.625,-1],[-1.070312,5.179688,-2.28125],[-1.070312,4.875,-4.125],[-1.070312,4.570313,-5.78125],[-1.070312,4.125,-6.5],[-1.070312,5.625,-1],[-0.677812,5.625,-0.9225],[-0.174922,5.179688,-2.104453],[-1.070312,5.179688,-2.28125],[0.54875,4.875,-3.805313],[-1.070312,4.875,-4.125],[1.198828,4.570313,-5.333203],[-1.070312,4.570313,-5.78125],[1.480938,4.125,-5.99625],[-1.070312,4.125,-6.5],[-0.360312,5.625,-0.71],[0.549375,5.179688,-1.619688],[1.858438,4.875,-2.92875],[3.034375,4.570313,-4.104687],[3.544688,4.125,-4.615],[-0.147812,5.625,-0.3925],[1.034141,5.179688,-0.895391],[2.735,4.875,-1.619062],[4.262891,4.570313,-2.26914],[4.925938,4.125,-2.55125],[-0.070312,5.625,0],[1.210938,5.179688,0],[3.054688,4.875,0],[4.710938,4.570313,0],[5.429688,4.125,0]];\nexports.faces=[[0,1,2],[2,3,0],[3,2,4],[4,5,3],[5,4,6],[6,7,5],[7,6,8],[8,9,7],[1,10,11],[11,2,1],[2,11,12],[12,4,2],[4,12,13],[13,6,4],[6,13,14],[14,8,6],[10,15,16],[16,11,10],[11,16,17],[17,12,11],[12,17,18],[18,13,12],[13,18,19],[19,14,13],[15,20,21],[21,16,15],[16,21,22],[22,17,16],[17,22,23],[23,18,17],[18,23,24],[24,19,18],[25,26,27],[27,28,25],[28,27,29],[29,30,28],[30,29,31],[31,32,30],[32,31,33],[33,34,32],[26,35,36],[36,27,26],[27,36,37],[37,29,27],[29,37,38],[38,31,29],[31,38,39],[39,33,31],[35,40,41],[41,36,35],[36,41,42],[42,37,36],[37,42,43],[43,38,37],[38,43,44],[44,39,38],[40,45,46],[46,41,40],[41,46,47],[47,42,41],[42,47,48],[48,43,42],[43,48,49],[49,44,43],[50,51,52],[52,53,50],[53,52,54],[54,55,53],[55,54,56],[56,57,55],[57,56,58],[58,59,57],[51,60,61],[61,52,51],[52,61,62],[62,54,52],[54,62,63],[63,56,54],[56,63,64],[64,58,56],[60,65,66],[66,61,60],[61,66,67],[67,62,61],[62,67,68],[68,63,62],[63,68,69],[69,64,63],[65,70,71],[71,66,65],[66,71,72],[72,67,66],[67,72,73],[73,68,67],[68,73,74],[74,69,68],[75,76,77],[77,78,75],[78,77,79],[79,80,78],[80,79,81],[81,82,80],[82,81,83],[83,84,82],[76,85,86],[86,77,76],[77,86,87],[87,79,77],[79,87,88],[88,81,79],[81,88,89],[89,83,81],[85,90,91],[91,86,85],[86,91,92],[92,87,86],[87,92,93],[93,88,87],[88,93,94],[94,89,88],[90,95,96],[96,91,90],[91,96,97],[97,92,91],[92,97,98],[98,93,92],[93,98,99],[99,94,93],[100,101,102],[102,103,100],[103,102,104],[104,105,103],[105,104,106],[106,107,105],[107,106,108],[108,109,107],[101,110,111],[111,102,101],[102,111,112],[112,104,102],[104,112,113],[113,106,104],[106,113,114],[114,108,106],[110,115,116],[116,111,110],[111,116,117],[117,112,111],[112,117,118],[118,113,112],[113,118,119],[119,114,113],[115,120,121],[121,116,115],[116,121,122],[122,117,116],[117,122,123],[123,118,117],[118,123,124],[124,119,118],[125,126,127],[127,128,125],[128,127,129],[129,130,128],[130,129,131],[131,132,130],[132,131,133],[133,134,132],[126,135,136],[136,127,126],[127,136,137],[137,129,127],[129,137,138],[138,131,129],[131,138,139],[139,133,131],[135,140,141],[141,136,135],[136,141,142],[142,137,136],[137,142,143],[143,138,137],[138,143,144],[144,139,138],[140,145,146],[146,141,140],[141,146,147],[147,142,141],[142,147,148],[148,143,142],[143,148,149],[149,144,143],[150,151,152],[152,153,150],[153,152,154],[154,155,153],[155,154,156],[156,157,155],[157,156,158],[158,159,157],[151,160,161],[161,152,151],[152,161,162],[162,154,152],[154,162,163],[163,156,154],[156,163,164],[164,158,156],[160,165,166],[166,161,160],[161,166,167],[167,162,161],[162,167,168],[168,163,162],[163,168,169],[169,164,163],[165,170,171],[171,166,165],[166,171,172],[172,167,166],[167,172,173],[173,168,167],[168,173,174],[174,169,168],[175,176,177],[177,178,175],[178,177,179],[179,180,178],[180,179,181],[181,182,180],[182,181,183],[183,184,182],[176,185,186],[186,177,176],[177,186,187],[187,179,177],[179,187,188],[188,181,179],[181,188,189],[189,183,181],[185,190,191],[191,186,185],[186,191,192],[192,187,186],[187,192,193],[193,188,187],[188,193,194],[194,189,188],[190,195,196],[196,191,190],[191,196,197],[197,192,191],[192,197,198],[198,193,192],[193,198,199],[199,194,193],[200,201,202],[202,203,200],[203,202,204],[204,205,203],[205,204,206],[206,207,205],[207,206,208],[208,209,207],[201,210,211],[211,202,201],[202,211,212],[212,204,202],[204,212,213],[213,206,204],[206,213,214],[214,208,206],[210,215,216],[216,211,210],[211,216,217],[217,212,211],[212,217,218],[218,213,212],[213,218,219],[219,214,213],[215,220,221],[221,216,215],[216,221,222],[222,217,216],[217,222,223],[223,218,217],[218,223,224],[224,219,218],[225,226,227],[227,228,225],[228,227,229],[229,230,228],[230,229,231],[231,232,230],[232,231,233],[233,234,232],[226,235,236],[236,227,226],[227,236,237],[237,229,227],[229,237,238],[238,231,229],[231,238,239],[239,233,231],[235,240,241],[241,236,235],[236,241,242],[242,237,236],[237,242,243],[243,238,237],[238,243,244],[244,239,238],[240,245,246],[246,241,240],[241,246,247],[247,242,241],[242,247,248],[248,243,242],[243,248,249],[249,244,243],[250,251,252],[252,253,250],[253,252,254],[254,255,253],[255,254,256],[256,257,255],[257,256,258],[258,259,257],[251,260,261],[261,252,251],[252,261,262],[262,254,252],[254,262,263],[263,256,254],[256,263,264],[264,258,256],[260,265,266],[266,261,260],[261,266,267],[267,262,261],[262,267,268],[268,263,262],[263,268,269],[269,264,263],[265,270,271],[271,266,265],[266,271,272],[272,267,266],[267,272,273],[273,268,267],[268,273,274],[274,269,268],[275,276,277],[277,278,275],[278,277,279],[279,280,278],[280,279,281],[281,282,280],[282,281,283],[283,284,282],[276,285,286],[286,277,276],[277,286,287],[287,279,277],[279,287,288],[288,281,279],[281,288,289],[289,283,281],[285,290,291],[291,286,285],[286,291,292],[292,287,286],[287,292,293],[293,288,287],[288,293,294],[294,289,288],[290,295,296],[296,291,290],[291,296,297],[297,292,291],[292,297,298],[298,293,292],[293,298,299],[299,294,293],[300,301,302],[302,303,300],[303,302,304],[304,305,303],[305,304,306],[306,307,305],[307,306,308],[301,309,310],[310,302,301],[302,310,311],[311,304,302],[304,311,312],[312,306,304],[306,312,313],[309,314,315],[315,310,309],[310,315,316],[316,311,310],[311,316,317],[317,312,311],[312,317,318],[314,319,320],[320,315,314],[315,320,321],[321,316,315],[316,321,322],[322,317,316],[317,322,323],[324,325,326],[326,327,324],[327,326,328],[328,329,327],[329,328,330],[330,331,329],[331,330,332],[325,333,334],[334,326,325],[326,334,335],[335,328,326],[328,335,336],[336,330,328],[330,336,337],[333,338,339],[339,334,333],[334,339,340],[340,335,334],[335,340,341],[341,336,335],[336,341,342],[338,343,344],[344,339,338],[339,344,345],[345,340,339],[340,345,346],[346,341,340],[341,346,347],[348,349,350],[350,351,348],[351,350,352],[352,353,351],[353,352,354],[354,355,353],[355,354,356],[349,357,358],[358,350,349],[350,358,359],[359,352,350],[352,359,360],[360,354,352],[354,360,361],[357,362,363],[363,358,357],[358,363,364],[364,359,358],[359,364,365],[365,360,359],[360,365,366],[362,367,368],[368,363,362],[363,368,369],[369,364,363],[364,369,370],[370,365,364],[365,370,371],[372,373,374],[374,375,372],[375,374,376],[376,377,375],[377,376,378],[378,379,377],[379,378,380],[373,381,382],[382,374,373],[374,382,383],[383,376,374],[376,383,384],[384,378,376],[378,384,385],[381,386,387],[387,382,381],[382,387,388],[388,383,382],[383,388,389],[389,384,383],[384,389,390],[386,391,392],[392,387,386],[387,392,393],[393,388,387],[388,393,394],[394,389,388],[389,394,395],[396,397,398],[398,399,396],[399,398,400],[400,401,399],[401,400,402],[402,403,401],[403,402,404],[404,405,403],[397,406,407],[407,398,397],[398,407,408],[408,400,398],[400,408,409],[409,402,400],[402,409,410],[410,404,402],[406,411,412],[412,407,406],[407,412,413],[413,408,407],[408,413,414],[414,409,408],[409,414,415],[415,410,409],[411,416,417],[417,412,411],[412,417,418],[418,413,412],[413,418,419],[419,414,413],[414,419,420],[420,415,414],[421,422,423],[423,424,421],[424,423,425],[425,426,424],[426,425,427],[427,428,426],[428,427,429],[429,430,428],[422,431,432],[432,423,422],[423,432,433],[433,425,423],[425,433,434],[434,427,425],[427,434,435],[435,429,427],[431,436,437],[437,432,431],[432,437,438],[438,433,432],[433,438,439],[439,434,433],[434,439,440],[440,435,434],[436,441,442],[442,437,436],[437,442,443],[443,438,437],[438,443,444],[444,439,438],[439,444,445],[445,440,439],[446,447,448],[448,449,446],[449,448,450],[450,451,449],[451,450,452],[452,453,451],[453,452,454],[454,455,453],[447,456,457],[457,448,447],[448,457,458],[458,450,448],[450,458,459],[459,452,450],[452,459,460],[460,454,452],[456,461,462],[462,457,456],[457,462,463],[463,458,457],[458,463,464],[464,459,458],[459,464,465],[465,460,459],[461,466,467],[467,462,461],[462,467,468],[468,463,462],[463,468,469],[469,464,463],[464,469,470],[470,465,464],[471,472,473],[473,474,471],[474,473,475],[475,476,474],[476,475,477],[477,478,476],[478,477,479],[479,480,478],[472,481,482],[482,473,472],[473,482,483],[483,475,473],[475,483,484],[484,477,475],[477,484,485],[485,479,477],[481,486,487],[487,482,481],[482,487,488],[488,483,482],[483,488,489],[489,484,483],[484,489,490],[490,485,484],[486,491,492],[492,487,486],[487,492,493],[493,488,487],[488,493,494],[494,489,488],[489,494,495],[495,490,489],[496,497,498],[498,499,496],[499,498,500],[500,501,499],[501,500,502],[502,503,501],[503,502,504],[504,505,503],[497,506,507],[507,498,497],[498,507,508],[508,500,498],[500,508,509],[509,502,500],[502,509,510],[510,504,502],[506,511,512],[512,507,506],[507,512,513],[513,508,507],[508,513,514],[514,509,508],[509,514,515],[515,510,509],[511,516,517],[517,512,511],[512,517,518],[518,513,512],[513,518,519],[519,514,513],[514,519,520],[520,515,514],[521,522,523],[523,524,521],[524,523,525],[525,526,524],[526,525,527],[527,528,526],[528,527,529],[529,530,528],[522,531,532],[532,523,522],[523,532,533],[533,525,523],[525,533,534],[534,527,525],[527,534,535],[535,529,527],[531,536,537],[537,532,531],[532,537,538],[538,533,532],[533,538,539],[539,534,533],[534,539,540],[540,535,534],[536,541,542],[542,537,536],[537,542,543],[543,538,537],[538,543,544],[544,539,538],[539,544,545],[545,540,539],[546,547,548],[548,549,546],[549,548,550],[550,551,549],[551,550,552],[552,553,551],[553,552,554],[554,555,553],[547,556,557],[557,548,547],[548,557,558],[558,550,548],[550,558,559],[559,552,550],[552,559,560],[560,554,552],[556,561,562],[562,557,556],[557,562,563],[563,558,557],[558,563,564],[564,559,558],[559,564,565],[565,560,559],[561,566,567],[567,562,561],[562,567,568],[568,563,562],[563,568,569],[569,564,563],[564,569,570],[570,565,564],[571,572,573],[573,574,571],[574,573,575],[575,576,574],[576,575,577],[577,578,576],[578,577,579],[579,580,578],[572,581,582],[582,573,572],[573,582,583],[583,575,573],[575,583,584],[584,577,575],[577,584,585],[585,579,577],[581,586,587],[587,582,581],[582,587,588],[588,583,582],[583,588,589],[589,584,583],[584,589,590],[590,585,584],[586,591,592],[592,587,586],[587,592,593],[593,588,587],[588,593,594],[594,589,588],[589,594,595],[595,590,589],[596,597,598],[597,596,599],[599,600,597],[600,599,601],[601,602,600],[602,601,603],[603,604,602],[605,596,606],[596,605,607],[607,599,596],[599,607,608],[608,601,599],[601,608,609],[609,603,601],[610,605,611],[605,610,612],[612,607,605],[607,612,613],[613,608,607],[608,613,614],[614,609,608],[615,610,616],[610,615,617],[617,612,610],[612,617,618],[618,613,612],[613,618,619],[619,614,613],[620,621,622],[621,620,623],[623,624,621],[624,623,625],[625,626,624],[626,625,627],[627,628,626],[629,620,630],[620,629,631],[631,623,620],[623,631,632],[632,625,623],[625,632,633],[633,627,625],[634,629,635],[629,634,636],[636,631,629],[631,636,637],[637,632,631],[632,637,638],[638,633,632],[639,634,640],[634,639,641],[641,636,634],[636,641,642],[642,637,636],[637,642,643],[643,638,637],[644,645,646],[645,644,647],[647,648,645],[648,647,649],[649,650,648],[650,649,651],[651,652,650],[653,644,654],[644,653,655],[655,647,644],[647,655,656],[656,649,647],[649,656,657],[657,651,649],[658,653,659],[653,658,660],[660,655,653],[655,660,661],[661,656,655],[656,661,662],[662,657,656],[663,658,664],[658,663,665],[665,660,658],[660,665,666],[666,661,660],[661,666,667],[667,662,661],[668,669,670],[669,668,671],[671,672,669],[672,671,673],[673,674,672],[674,673,675],[675,676,674],[677,668,678],[668,677,679],[679,671,668],[671,679,680],[680,673,671],[673,680,681],[681,675,673],[682,677,683],[677,682,684],[684,679,677],[679,684,685],[685,680,679],[680,685,686],[686,681,680],[687,682,688],[682,687,689],[689,684,682],[684,689,690],[690,685,684],[685,690,691],[691,686,685],[692,693,694],[694,695,692],[695,694,696],[696,697,695],[697,696,698],[698,699,697],[699,698,700],[700,701,699],[693,702,703],[703,694,693],[694,703,704],[704,696,694],[696,704,705],[705,698,696],[698,705,706],[706,700,698],[702,707,708],[708,703,702],[703,708,709],[709,704,703],[704,709,710],[710,705,704],[705,710,711],[711,706,705],[707,712,713],[713,708,707],[708,713,714],[714,709,708],[709,714,715],[715,710,709],[710,715,716],[716,711,710],[717,718,719],[719,720,717],[720,719,721],[721,722,720],[722,721,723],[723,724,722],[724,723,725],[725,726,724],[718,727,728],[728,719,718],[719,728,729],[729,721,719],[721,729,730],[730,723,721],[723,730,731],[731,725,723],[727,732,733],[733,728,727],[728,733,734],[734,729,728],[729,734,735],[735,730,729],[730,735,736],[736,731,730],[732,737,738],[738,733,732],[733,738,739],[739,734,733],[734,739,740],[740,735,734],[735,740,741],[741,736,735],[742,743,744],[744,745,742],[745,744,746],[746,747,745],[747,746,748],[748,749,747],[749,748,750],[750,751,749],[743,752,753],[753,744,743],[744,753,754],[754,746,744],[746,754,755],[755,748,746],[748,755,756],[756,750,748],[752,757,758],[758,753,752],[753,758,759],[759,754,753],[754,759,760],[760,755,754],[755,760,761],[761,756,755],[757,762,763],[763,758,757],[758,763,764],[764,759,758],[759,764,765],[765,760,759],[760,765,766],[766,761,760],[767,768,769],[769,770,767],[770,769,771],[771,772,770],[772,771,773],[773,774,772],[774,773,775],[775,776,774],[768,777,778],[778,769,768],[769,778,779],[779,771,769],[771,779,780],[780,773,771],[773,780,781],[781,775,773],[777,782,783],[783,778,777],[778,783,784],[784,779,778],[779,784,785],[785,780,779],[780,785,786],[786,781,780],[782,787,788],[788,783,782],[783,788,789],[789,784,783],[784,789,790],[790,785,784],[785,790,791],[791,786,785]];\n\n});\n\nrequire.define(\"/index.js\",function(require,module,exports,__dirname,__filename,process,global){// MeshLife WebGL demo\n// Author: Mikola Lysenko (http://0fps.net)\n// License: BSD\nvar trimesh = require('trimesh');\nvar MeshLife = require('./meshlife.js').MeshLife;\nvar loop_subdivide = trimesh.loop_subdivision;\nvar ArcballCamera = require('./arcball.js').ArcballCamera;\nvar meshSet = require(\"./shapes.js\").meshSet;\n\nfunction hex2rgb(hex) {\n  return [ (hex>>16)/255.0, ((hex>>8)&0xff)/255.0, (hex&0xff)/255.0 ]\n}\n\nvar color_scheme = {\n  bg_color:     hex2rgb(0x64aad0),\n  light_color:  hex2rgb(0x3914af),\n  dark_color:   hex2rgb(0x41db00),\n  cell_color:   hex2rgb(0xff8b00)\n};\n\n\n//Context and mesh shader variables\nvar context;\nvar meshShader;\nvar simulation;\nvar paused = false;\nvar camera = new ArcballCamera();\nvar old_params = { mesh: \"\", inner_radius: 0, outer_radius: 0 };\nvar buttons = {\n  rotate: false,\n  zoom: false,\n  pan: false\n};\n\n\nfunction printVec3(vec) {\n  return \"vec3(\" + vec[0] + \",\" + vec[1] + \",\" + vec[2] + \")\";\n}\n\n//Flattens an array\nfunction flatten(arr) {\n  var flat = [];\n  for(var i=0; i<arr.length; ++i) {\n    var row = arr[i];\n    for(var j=0; j<row.length; ++j) {\n      flat.push(row[j]);\n    }\n  }\n  return flat;\n}\n\n// Render (using setInterval as WebGL Inspector have problem with requestAnimationFrame)\nvar nextFrame = (function(){\n      return  window.requestAnimationFrame       || \n              window.webkitRequestAnimationFrame || \n              window.mozRequestAnimationFrame    || \n              window.oRequestAnimationFrame      || \n              window.msRequestAnimationFrame     || \n              function( callback ){\n                window.setTimeout(callback, 1000 / 60);\n              };\n    })();\n    \n//Retrieves parameters\nfunction getParams() {\n  return {\n    mesh:         $(\"#ctrl_Mesh\").val(),\n    subdiv_count: parseInt($(\"#ctrl_Subdivs\").val()),\n    outer_radius: parseFloat($(\"#ctrl_OuterRadius\").val()),\n    inner_radius: parseFloat($(\"#ctrl_InnerRadius\").val()),\n    alpha_n:      parseFloat($(\"#ctrl_AlphaN\").val()),\n    alpha_m:      parseFloat($(\"#ctrl_AlphaM\").val()),\n    life_range:   [ parseFloat($(\"#ctrl_LiveLo\").val()), parseFloat($(\"#ctrl_LiveHi\").val()) ],\n    death_range:  [ parseFloat($(\"#ctrl_DeadLo\").val()), parseFloat($(\"#ctrl_DeadHi\").val()) ],\n    initial_sites:  parseInt($(\"#ctrl_Splats\").val()),\n    delta_t:      parseFloat($(\"#ctrl_Timestep\").val()),\n    step_mode:    $(\"#ctrl_Timestep\").val()\n  }\n}\n\n//Initialize game of life\nfunction reset() {\n  for(var i=0; i<simulation.vertex_count; ++i) {\n    simulation.state[i] = 0.0;\n  }\n  var splat_count = parseInt($(\"#ctrl_Splats\").val());\n  for(var i=0; i<splat_count; ++i) {\n    simulation.splat(Math.floor(Math.random() * simulation.vertex_count));\n  }\n}\n\n//Rebuilds the solver/stiffness matrix\nfunction rebuild() {\n\n  var params = getParams();\n\n  if(params.mesh !== old_params.mesh ||\n     params.inner_radius !== old_params.inner_radius ||\n     params.outer_radius !== old_params.outer_radius ||\n     params.subdiv_count !== old_params.subdiv_count) {\n\n    //TODO: Get mesh based on value of drop down\n    var mesh = meshSet[params.mesh];\n    \n    //Apply subdivisions\n    for(var i=0; i<params.subdiv_count; ++i) {\n      mesh = loop_subdivide(mesh);\n    }\n    \n    params.positions = mesh.positions;\n    params.faces = mesh.faces;\n\n    //Create simulation\n    simulation = new MeshLife(params);\n    \n    //Save parameters\n    params.stars   = simulation.stars;\n    params.K_inner = simulation.K_inner;\n    params.K_outer = simulation.K_outer;\n\n    params.normals = trimesh.vertex_normals({\n      positions: mesh.positions,\n      faces:     mesh.faces,\n      stars:     simulation.stars\n    });\n    \n    //Release previous shader if in use\n    if(meshShader) {\n      meshShader.dispose();\n    }\n    \n    //Create mesh shader\n    var meshShaderInfo = {    \n      vertexShader: [\n        \"uniform     mat4     transform;\",\n        \"uniform     mat4     cameraInverse;\",\n        \"uniform     mat4     cameraProjection;\",\n        \n        \"attribute  vec3      position;\",\n        \"attribute  vec3      normal;\",\n        \"attribute  float     state;\",\n        \n        \"varying    float     intensity;\",\n        \"varying    vec3      f_normal;\",\n        \n        \"void main(void) {\",\n          \"gl_Position = cameraProjection * cameraInverse * transform * vec4( 0.2*normal*state + position, 1.0 );\",\n          \"intensity = state;\",\n          \"f_normal = normal;\",\n        \"}\"\n      ].join(\"\\n\"),\n      fragmentShader: [\n        \"#ifdef GL_ES\",\n          \"precision highp float;\",\n        \"#endif\",    \n\n        \"varying float intensity;\",\n        \"varying vec3  f_normal;\",\n        \n        \"#define LIGHT_COLOR \" + printVec3(color_scheme.light_color),\n        \"#define DARK_COLOR  \" + printVec3(color_scheme.dark_color),\n        \"#define CELL_COLOR  \" + printVec3(color_scheme.cell_color),\n        \n        \"void main() {\",\n          \"float light = 0.3 * dot(normalize(f_normal), vec3(0, 1, 0)) + 0.5;\",\n          \"gl_FragColor = vec4(mix(mix(LIGHT_COLOR, DARK_COLOR, light), CELL_COLOR, intensity), 1);\",\n        \"}\"\n      ].join(\"\\n\"),\n      data: {\n        transform:        new GLOW.Matrix4(),\n        cameraInverse:    GLOW.defaultCamera.inverse,\n        cameraProjection: GLOW.defaultCamera.projection,\n        position:         new Float32Array(flatten(simulation.positions)),\n        normal:           new Float32Array(flatten(params.normals)),\n        state:            simulation.state\n      },\n      interleave: {\n        state: false\n      },\n      indices: new Uint16Array(flatten(simulation.faces)),\n      primitive: GL.TRIANGLES\n    };\n\n    meshShader = new GLOW.Shader(meshShaderInfo);\n    \n  } else {\n  \n    params.positions  = old_params.positions;\n    params.faces      = old_params.faces;\n    params.normals    = old_params.normals;\n    params.stars      = old_params.stars;\n    params.K_inner    = old_params.K_inner;\n    params.K_outer    = old_params.K_outer;\n    \n    simulation        = new MeshLife(params);\n  }\n  \n  //Save parameters\n  old_params = params;\n  \n  //Reset simulation\n  reset();\n}\n\n\n\n//Initialize WebGL/GLOW\nfunction init() {\n  // create a context and set white background\n  try {\n    context = new GLOW.Context();\n  } catch(e) {\n    alert(\"WebGL not supported :-(\");\n    return false;\n  }\n\n  //Make sure we have floating point textures\n  if( !context.enableExtension( \"OES_texture_float\" )) {\n    alert( \"No support for float textures!\" );\n    return false;\n  }\n\n  //Set up basic parameters\n  context.setupClear( { red: color_scheme.bg_color[0], green: color_scheme.bg_color[1], blue: color_scheme.bg_color[2] } );\n\n  // attach the context's DOM element\n  var container = document.getElementById(\"container\");\n  container.appendChild( context.domElement );\n\n  //Set up camera\n  GLOW.defaultCamera.localMatrix.setPosition( 0, 0, 50 );\n  GLOW.defaultCamera.update();\n\n  //Rebuild the system\n  rebuild();\n\n  $(\"#ctrl_Reset\").click(reset);\n  $(\"#ctrl_Rebuild\").click(rebuild);\n  $(\"#ctrl_Step\").click(function() {\n    simulation.step();\n  });\n  $(\"#ctrl_Pause\").click(function() {\n    if(paused) {\n      $(\"#ctrl_Pause\").val(\"Pause\");\n      paused = false;\n    } else {\n      $(\"#ctrl_Pause\").val(\"Resume\");\n      paused = true;\n    }\n  });\n  $(\"#container\").mousemove(function(e) {\n    var container = $(\"#container\");\n    camera.update(e.pageX/container.width()-0.5, e.pageY/container.height()-0.5, {\n      rotate: buttons.rotate || !(e.ctrlKey || e.altKey) && (e.which === 1),\n      pan:    buttons.pan    || (e.altKey && e.which !== 0) || (e.which === 2),\n      zoom:   buttons.zoom   || (e.ctrlKey && e.which !== 0) || e.which === 3\n    });\n  });\n  $(document).keydown(function(e) {\n    if(e.keyCode === 65) {\n      buttons.rotate = true;\n    }\n    if(e.keyCode === 83) {\n      buttons.pan = true;\n    }\n    if(e.keyCode === 68) {\n      buttons.zoom = true;\n    }\n  });\n  $(document).keyup(function(e) {\n    if(e.keyCode === 65) {\n      buttons.rotate = false;\n    }\n    if(e.keyCode === 83) {\n      buttons.pan = false;\n    }\n    if(e.keyCode === 68) {\n      buttons.zoom = false;\n    }\n  });  \n  \n  //Success\n  render();\n}\n\n//Render a frame\nfunction render() {\n  //Initialize context\n  context.cache.clear();\n  context.enableDepthTest(true);\n  context.enableCulling(false);\n  context.clear();\n  \n  //Update game of life\n  if(!paused) {\n    simulation.step();\n  }\n  \n  var matrix = camera.matrix();\n  for(var i=0; i<4; ++i) {\n    for(var j=0; j<4; ++j) {\n      meshShader.transform.value[i+4*j] = matrix[i][j];\n    }\n  }\n  \n  meshShader.state.bufferData(simulation.state, GL.DYNAMIC_DRAW);\n  meshShader.draw();\n  \n  nextFrame(render);\n}\n\n//Call load when document is ready\n$(document).ready(init);\n\n\n});\nrequire(\"/index.js\");\n})();\n"
  },
  {
    "path": "MeshLife/index.html",
    "content": "<html><!DOCTYPE html>\n<html>\n<head>\n  <title> MeshLife </title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <link href=\"main.css\" rel=\"stylesheet\" type=\"text/css\"></link>\n  <script src=\"jquery.min.js\"></script>\n  <script src=\"GLOW.min.js\"></script>\n  <script src=\"bundle.js\"></script>\n</head>\n<body>\n  <div id=\"controls\">\n    \n    <p> \n      <h2> Simulation Parameters: </h2>\n      <br/>\n      <table>\n        <tr>\n          <td>\n            Mesh:\n          </td>\n          <td>\n            <select id=\"ctrl_Mesh\">\n              <option>Grid</option>\n              <option>Sphere</option>\n              <option>Torus</option>\n              <option>Möbius</option>\n              <option>Bunny</option>\n            </select>\n          </td>\n        </tr>\n        <tr>\n          <td> Subdivisions: </td>\n          <td> <input type=\"number\" id=\"ctrl_Subdivs\" value=\"0\"></input> </td>\n        </tr>\n        <tr> \n          <td> Outer Radius: </td>\n          <td> <input type=\"number\" id=\"ctrl_OuterRadius\" value=\"1.0\"></input> </td>\n        </tr>\n        <tr>\n          <td> Inner Radius: </td>\n          <td> <input type=\"number\" id=\"ctrl_InnerRadius\" value=\"0.3333333\"></input> </td>\n        </tr>\n        <tr>\n          <td> Birth Min: </td>\n          <td> <input type=\"number\" id=\"ctrl_LiveLo\" value=\"0.278\"></input> </td>\n        </tr>\n        <tr>\n          <td> Birth Max: </td>\n          <td> <input type=\"number\" id=\"ctrl_LiveHi\" value=\"0.365\"></input> </td>\n        </tr>\n        <tr>\n          <td> Survive Min: </td>\n          <td> <input type=\"number\" id=\"ctrl_DeadLo\" value=\"0.267\"></input> </td>\n        </tr>\n        <tr>\n          <td> Survive Max: </td>\n          <td> <input type=\"number\" id=\"ctrl_DeadHi\" value=\"0.445\"></input> </td>\n        </tr>\n        <tr>\n          <td> Alpha N: </td>\n          <td> <input type=\"number\" id=\"ctrl_AlphaN\" value=\"0.028\"></input> </td>\n        </tr>\n        <tr>\n          <td> Alpha M: </td>\n          <td> <input type=\"number\" id=\"ctrl_AlphaM\" value=\"0.147\"></input> </td>\n        </tr>\n        <tr>\n          <td> Timestep: </td>\n          <td>\n            <select id=\"ctrl_Timestep\">\n              <option value=\"discrete\">Discrete</option>\n              <option value=\"smooth1\">Smooth 1</option>\n              <option value=\"smooth2\">Smooth 2</option>\n              <option value=\"smooth3\">Smooth 1 (M)</option>\n              <option value=\"smooth4\">Smooth 2 (M)</option>\n            </select>\n          </td>\n        </tr>\n        <tr>\n          <td> Delta t: </td>\n          <td> <input type=\"number\" id=\"ctrl_DeltaT\" value=0.1></input> </td>\n        </tr>\n        <tr>\n          <td> Initial Sites: </td>\n          <td> <input type=\"number\" id=\"ctrl_Splats\" value=\"100\"></input> </td>\n        </tr>\n      </table>\n      <p><input type=\"button\" id=\"ctrl_Rebuild\" value=\"Rebuild System (SLOW)\"></input></p>\n    </p>\n    \n    <p>\n      <input type=\"button\" id=\"ctrl_Reset\" value=\"Reset\"></input>\n      <input type=\"button\" id=\"ctrl_Pause\" value=\"Pause\"></input>\n      <input type=\"button\" id=\"ctrl_Step\" value=\"Step\"></input>\n    </p>\n    \n  </div>\n  <div id=\"container\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "MeshLife/main.css",
    "content": "#container {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n}\n\n#controls {\n  position: absolute;\n  top: 10px;\n  left: 10px;\n  z-index: 1;\n  font-family: Sans-Serif;\n}\n\n"
  },
  {
    "path": "MeshSimplify/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "MeshSimplify/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "MeshSimplify/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "MeshSimplify/experiment.txt",
    "content": "\nMethod:  tested each algorithm on 65^3 grid.  Plotted the function\n\n  sin(omega * x) + sin(omega * y) + sin(omega * z)\n\nin the range [-pi/2, pi/2] x [-pi/2, pi/2] x [-pi/2, pi/2]\n\nTo control for garbage collection and other unpredictable run time events, each run was repeated 100x to get an averaged measurement.\n\nAlso, since v8 has a JIT, we ran each method on a grid initialized with omega = 5 for 100 iterations in an attempt to trigger v8's optimizer.\n\nMeasurements were taken on my laptop:\n\n  node.js version: 0.6.14\n  Linux Mint 12\n  CPU: Intel Core2 Duo P8700 @ 2.53GHz\n  RAM: 4 GB\n\nFirst column is omega, second column is time taken.  All measurements are in milliseconds (ms)\n\nmc:\n\n0, 29.93\n1, 43.62\n2, 61.48\n3, 93.31\n4, 138.2\n5, 145.8\n6, 186.0\n7, 213.2\n8, 255.9\n9, 272.1\n10, 274.6\n\n\n\n\nsn (no precalc):\n\n0, 26.79\n1, 33.95\n2, 44.87\n3, 54.74\n4, 59.81\n5, 86.61\n6, 98.45\n7, 114.5\n8, 131.2\n9, 131.0\n10, 147.7\n\n\n\n\n\nsn (w/ edge precalculation):\n\n0, 24.06\n1, 29.42\n2, 37.78\n3, 47.72\n4, 51.36\n5, 74.54\n6, 83.99\n7, 97.34\n8, 112.4\n9, 109.2\n10, 124.3\n\n\n\nmt (NOTE: Number of iterations was reduced to 20 in order to get benchmark to complete in a reasonable time):\n\n0, 57\n1, 171\n2, 250\n3, 392\n4, 510\n5, 620\n6, 784\n7, 922\n8, 1070\n9, 1220\n10, 1420\n\n\n\n\n\n\nMesh sizes:\n\nvertices/faces:\n\n\nsn:\n\n0, 0\n7759, 7569\n15261, 14513\n23247, 22695\n30590, 29132\n38627, 37749\n45957, 43861\n53899, 52755\n60978, 58304\n68991, 67665\n76193, 73133\n\n\n\nmc:\n\n0, 0\n31038, 15520\n61034, 30512\n93042, 46548\n122378, 61204\n154758, 77504\n184138, 92224\n216282, 108484\n244514, 122576\n277422, 139440\n306554, 154168\n\nmt:\n\n0, 0\n139770, 42701\n214610, 65071\n338766, 102805\n431466, 130840\n553458, 167781\n652046, 197603\n769878, 233265\n869174, 263474\n986538, 298725\n1087086, 329083\n\n\n\n"
  },
  {
    "path": "MeshSimplify/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Volume Sampling Toolbox</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n    <!--DSP-->\n    <script src=\"vendor/dsp.js\"></script>\n\n\n    <!--Mesh algorithms-->\n    <script src=\"js/surfacenets.js\"></script>\n    \n    <!--Downsamplers-->\n    <script src=\"js/nearestfilter.js\"></script>\n    <script src=\"js/boxfilter.js\"></script>\n    <script src=\"js/maxfilter.js\"></script>\n    <script src=\"js/minfilter.js\"></script>\n    <script src=\"js/medianfilter.js\"></script>\n    <script src=\"js/closing.js\"></script>\n    <script src=\"js/opening.js\"></script>\n    \n    <script src=\"js/perlinnoise.js\"></script>\n    <script src=\"js/testdata.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tVolume Resampling\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Input Data:</p>\n\t    <p><select id=\"datasource\"></select></p>\n\t    <p>Filter:</p>\n\t    <p><select id=\"filters\"></select></p>\n\t    <p>Scale:</p>\n\t    <p><select id=\"resolution\"></select></p>\n\t    <p>Show facets: <input type=\"checkbox\" id=\"showfacets\" value=\"checked\" /></p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" value=\"checked\" /></p>\n\t    <p>Volume Resolution: <input type=\"text\" id=\"volumeres\" value=\"0\" /> </p>\n\t    <p>Vertex count: <input type=\"text\" id=\"vertcount\" value=\"0\" /> </p>\n\t    <p>Face count: <input type=\"text\" id=\"facecount\" value=\"0\" /> </p>\n\t  </div> \n\t</div> \n\t\n\t<script type=\"text/javascript\">\n\t(function() {\n\t\"use strict\";\n\t\n\t  (function() {\n\t\t  var resolution = document.getElementById(\"resolution\");\n\t\t  resolution.add(new Option('1', 0), null);\n\t    for(var i=1; i<5; ++i) {\n  \t\t  resolution.add(new Option('1/' + (1<<i), i), null);\n\t    }\n\t  })();\n\t\n\t\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControls;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\t\n\t\tvar simplifiers = {\n\t\t     'Nearest': NearestFilter\n\t\t   , 'Trilinear': BoxFilter\n\t\t   , 'Min': MinFilter\n\t\t   , 'Max': MaxFilter\n\t\t   , 'Median': MedianFilter\n\t\t   , 'Closing': ClosingFilter\n\t\t   , 'Opening': OpeningFilter\n\t\t};\n\t\tvar testdata = {};\n\t\t\n\t\t\n\t\tfunction updateMesh() {\n\t\t\n\t\t  if(surfacemesh) {\n\t\t    scene.remove(surfacemesh);\n\t\t    scene.remove(wiremesh);\n\t\t  }\n\t\t  \n\t\t  //Downsample volume\n\t\t  var field = testdata[ document.getElementById(\"datasource\").value ]()\n\t\t    , num_iters = parseInt(document.getElementById('resolution').value, 10)\n\t\t    , filter = filters[ document.getElementById(\"filters\").value ]\n\t\t    , min_dim = Math.min(field.dims[0], Math.min(field.dims[1], field.dims[2]));\n\t\t  \n\t    if((1 << num_iters) >= min_dim) {\n\t      field = { volume: new Float32Array([0,0,0,0,0,0,0,0]), dims:[1,1,1] };\n\t    } else {\n\t\t    for(var i=0; (1<<i)<min_dim && i<num_iters; ++i) {\n\t\t      field = filter(field.volume, field.dims);\n\t\t    }\n\t\t  }\n\t\t    \n\t\t  //Create mesh and display\n\t\t  var result = SurfaceNets( field.volume, field.dims );\n      \n      //Update statistics\n      document.getElementById(\"volumeres\").value = field.dims[0] + 'x' + field.dims[1] + 'x' + field.dims[2];\n      document.getElementById(\"vertcount\").value = result.vertices.length;\n      document.getElementById(\"facecount\").value = result.faces.length;\n      \n      //Create surface mesh      \n      geometry = new THREE.Geometry();  \t      \n      for(var i=0; i<result.vertices.length; ++i) {\n        var v = result.vertices[i];\n        geometry.vertices.push(new THREE.Vector3(v[0], v[1], v[2]));\n      }\n      \n      for(var i=0; i<result.faces.length; ++i) {\n        var f = result.faces[i];\n        geometry.faces.push(new THREE.Face4(f[0], f[1], f[2], f[3]));\n      }\n      \n      geometry.computeFaceNormals();\n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n\t\t\t\n      var bb = geometry.boundingBox\n        , maxdim = 1.0;\n      for(var i=0; i<3; ++i) {\n        maxdim = Math.max(maxdim, field.dims[i]);\n      }\n      var scale = 1.0 / maxdim;\n      \n      \n      var material\t= new THREE.MeshNormalMaterial();\n      surfacemesh\t= new THREE.Mesh( geometry, material );\n      surfacemesh.doubleSided = true;\n      var wirematerial = new THREE.MeshBasicMaterial({\n          color : 0xffffff\n        , wireframe : true\n      });\n      wiremesh = new THREE.Mesh(geometry, wirematerial);\n      wiremesh.doubleSided = true;\n      scene.add( surfacemesh );\n      scene.add( wiremesh );\t\t\t\n\n      \n      wiremesh.scale.x = surfacemesh.scale.x = scale;\n      wiremesh.scale.y = surfacemesh.scale.y = scale;\n      wiremesh.scale.z = surfacemesh.scale.z = scale;\n      \n      wiremesh.position.x = surfacemesh.position.x = -field.dims[0] * scale * 0.5;\n      wiremesh.position.y = surfacemesh.position.y = -field.dims[1] * scale * 0.5;\n      wiremesh.position.z = surfacemesh.position.z = -field.dims[2] * scale * 0.5;\n      \n      scene.remove(surfacemesh);\n      scene.add(surfacemesh);\n      scene.remove(wiremesh);\n      scene.add(wiremesh);\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\t\t\t\t\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 3);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\t\t\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n\t\t\t// here you add your objects\n\t\t\t// - you will most likely replace this part by your own\n\t\t\tvar light\t= new THREE.AmbientLight( Math.random() * 0xffffff );\n\t\t\tscene.add( light );\n\t\t\tvar light\t= new THREE.DirectionalLight( Math.random() * 0xffffff );\n\t\t\tlight.position.set( Math.random(), Math.random(), Math.random() ).normalize();\n\t\t\tscene.add( light );\n\t\t\t\n\t\t\t//Initialize dom elements\n\t\t\ttestdata = createTestData();\n\t\t\tvar ds = document.getElementById(\"datasource\");\n\t\t\tfor(var id in testdata) {\n\t\t\t  ds.add(new Option(id, id), null);\n\t\t\t}\n\t\t\tds.onchange = updateMesh;\n\t\t\tvar ms = document.getElementById(\"filters\");\n\t\t\tfor(var alg in filters) {\n\t\t\t  ms.add(new Option(alg, alg), null);\n\t\t\t}\n\t\t\tms.onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"resolution\").onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"showfacets\").checked = true;\n\t\t\tdocument.getElementById(\"showedges\").checked  = true;\n\t\t\t\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      surfacemesh.visible = document.getElementById(\"showfacets\").checked;\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t})();\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "MeshSimplify/js/marchingcubes.js",
    "content": "/**\n * Javascript Marching Cubes\n *\n * Based on Paul Bourke's classic implementation:\n *    http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * JS port by Mikola Lysenko\n */\n\nvar MarchingCubes = (function() {\nvar edgeTable= new Uint32Array([\n      0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n      0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n      0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n      0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n      0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n      0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n      0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n      0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n      0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n      0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n      0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n      0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n      0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n      0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n      0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n      0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n      0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n      0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n      0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n      0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n      0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n      0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n      0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n      0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n      0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n      0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n      0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n      0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n      0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n      0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n      0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n      0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   ])\n  , triTable = [\n      [],\n      [0, 8, 3],\n      [0, 1, 9],\n      [1, 8, 3, 9, 8, 1],\n      [1, 2, 10],\n      [0, 8, 3, 1, 2, 10],\n      [9, 2, 10, 0, 2, 9],\n      [2, 8, 3, 2, 10, 8, 10, 9, 8],\n      [3, 11, 2],\n      [0, 11, 2, 8, 11, 0],\n      [1, 9, 0, 2, 3, 11],\n      [1, 11, 2, 1, 9, 11, 9, 8, 11],\n      [3, 10, 1, 11, 10, 3],\n      [0, 10, 1, 0, 8, 10, 8, 11, 10],\n      [3, 9, 0, 3, 11, 9, 11, 10, 9],\n      [9, 8, 10, 10, 8, 11],\n      [4, 7, 8],\n      [4, 3, 0, 7, 3, 4],\n      [0, 1, 9, 8, 4, 7],\n      [4, 1, 9, 4, 7, 1, 7, 3, 1],\n      [1, 2, 10, 8, 4, 7],\n      [3, 4, 7, 3, 0, 4, 1, 2, 10],\n      [9, 2, 10, 9, 0, 2, 8, 4, 7],\n      [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n      [8, 4, 7, 3, 11, 2],\n      [11, 4, 7, 11, 2, 4, 2, 0, 4],\n      [9, 0, 1, 8, 4, 7, 2, 3, 11],\n      [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1],\n      [3, 10, 1, 3, 11, 10, 7, 8, 4],\n      [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4],\n      [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3],\n      [4, 7, 11, 4, 11, 9, 9, 11, 10],\n      [9, 5, 4],\n      [9, 5, 4, 0, 8, 3],\n      [0, 5, 4, 1, 5, 0],\n      [8, 5, 4, 8, 3, 5, 3, 1, 5],\n      [1, 2, 10, 9, 5, 4],\n      [3, 0, 8, 1, 2, 10, 4, 9, 5],\n      [5, 2, 10, 5, 4, 2, 4, 0, 2],\n      [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n      [9, 5, 4, 2, 3, 11],\n      [0, 11, 2, 0, 8, 11, 4, 9, 5],\n      [0, 5, 4, 0, 1, 5, 2, 3, 11],\n      [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5],\n      [10, 3, 11, 10, 1, 3, 9, 5, 4],\n      [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10],\n      [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3],\n      [5, 4, 8, 5, 8, 10, 10, 8, 11],\n      [9, 7, 8, 5, 7, 9],\n      [9, 3, 0, 9, 5, 3, 5, 7, 3],\n      [0, 7, 8, 0, 1, 7, 1, 5, 7],\n      [1, 5, 3, 3, 5, 7],\n      [9, 7, 8, 9, 5, 7, 10, 1, 2],\n      [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3],\n      [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2],\n      [2, 10, 5, 2, 5, 3, 3, 5, 7],\n      [7, 9, 5, 7, 8, 9, 3, 11, 2],\n      [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11],\n      [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7],\n      [11, 2, 1, 11, 1, 7, 7, 1, 5],\n      [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11],\n      [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0],\n      [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0],\n      [11, 10, 5, 7, 11, 5],\n      [10, 6, 5],\n      [0, 8, 3, 5, 10, 6],\n      [9, 0, 1, 5, 10, 6],\n      [1, 8, 3, 1, 9, 8, 5, 10, 6],\n      [1, 6, 5, 2, 6, 1],\n      [1, 6, 5, 1, 2, 6, 3, 0, 8],\n      [9, 6, 5, 9, 0, 6, 0, 2, 6],\n      [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n      [2, 3, 11, 10, 6, 5],\n      [11, 0, 8, 11, 2, 0, 10, 6, 5],\n      [0, 1, 9, 2, 3, 11, 5, 10, 6],\n      [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11],\n      [6, 3, 11, 6, 5, 3, 5, 1, 3],\n      [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6],\n      [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9],\n      [6, 5, 9, 6, 9, 11, 11, 9, 8],\n      [5, 10, 6, 4, 7, 8],\n      [4, 3, 0, 4, 7, 3, 6, 5, 10],\n      [1, 9, 0, 5, 10, 6, 8, 4, 7],\n      [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4],\n      [6, 1, 2, 6, 5, 1, 4, 7, 8],\n      [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7],\n      [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6],\n      [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n      [3, 11, 2, 7, 8, 4, 10, 6, 5],\n      [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11],\n      [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6],\n      [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6],\n      [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6],\n      [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11],\n      [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7],\n      [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n      [10, 4, 9, 6, 4, 10],\n      [4, 10, 6, 4, 9, 10, 0, 8, 3],\n      [10, 0, 1, 10, 6, 0, 6, 4, 0],\n      [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10],\n      [1, 4, 9, 1, 2, 4, 2, 6, 4],\n      [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4],\n      [0, 2, 4, 4, 2, 6],\n      [8, 3, 2, 8, 2, 4, 4, 2, 6],\n      [10, 4, 9, 10, 6, 4, 11, 2, 3],\n      [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6],\n      [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10],\n      [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1],\n      [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3],\n      [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1],\n      [3, 11, 6, 3, 6, 0, 0, 6, 4],\n      [6, 4, 8, 11, 6, 8],\n      [7, 10, 6, 7, 8, 10, 8, 9, 10],\n      [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10],\n      [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0],\n      [10, 6, 7, 10, 7, 1, 1, 7, 3],\n      [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7],\n      [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9],\n      [7, 8, 0, 7, 0, 6, 6, 0, 2],\n      [7, 3, 2, 6, 7, 2],\n      [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7],\n      [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7],\n      [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11],\n      [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1],\n      [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6],\n      [0, 9, 1, 11, 6, 7],\n      [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0],\n      [7, 11, 6],\n      [7, 6, 11],\n      [3, 0, 8, 11, 7, 6],\n      [0, 1, 9, 11, 7, 6],\n      [8, 1, 9, 8, 3, 1, 11, 7, 6],\n      [10, 1, 2, 6, 11, 7],\n      [1, 2, 10, 3, 0, 8, 6, 11, 7],\n      [2, 9, 0, 2, 10, 9, 6, 11, 7],\n      [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n      [7, 2, 3, 6, 2, 7],\n      [7, 0, 8, 7, 6, 0, 6, 2, 0],\n      [2, 7, 6, 2, 3, 7, 0, 1, 9],\n      [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6],\n      [10, 7, 6, 10, 1, 7, 1, 3, 7],\n      [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8],\n      [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7],\n      [7, 6, 10, 7, 10, 8, 8, 10, 9],\n      [6, 8, 4, 11, 8, 6],\n      [3, 6, 11, 3, 0, 6, 0, 4, 6],\n      [8, 6, 11, 8, 4, 6, 9, 0, 1],\n      [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6],\n      [6, 8, 4, 6, 11, 8, 2, 10, 1],\n      [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6],\n      [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9],\n      [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n      [8, 2, 3, 8, 4, 2, 4, 6, 2],\n      [0, 4, 2, 4, 6, 2],\n      [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8],\n      [1, 9, 4, 1, 4, 2, 2, 4, 6],\n      [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1],\n      [10, 1, 0, 10, 0, 6, 6, 0, 4],\n      [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3],\n      [10, 9, 4, 6, 10, 4],\n      [4, 9, 5, 7, 6, 11],\n      [0, 8, 3, 4, 9, 5, 11, 7, 6],\n      [5, 0, 1, 5, 4, 0, 7, 6, 11],\n      [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5],\n      [9, 5, 4, 10, 1, 2, 7, 6, 11],\n      [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5],\n      [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2],\n      [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n      [7, 2, 3, 7, 6, 2, 5, 4, 9],\n      [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7],\n      [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0],\n      [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8],\n      [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7],\n      [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4],\n      [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10],\n      [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n      [6, 9, 5, 6, 11, 9, 11, 8, 9],\n      [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5],\n      [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11],\n      [6, 11, 3, 6, 3, 5, 5, 3, 1],\n      [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6],\n      [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10],\n      [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5],\n      [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n      [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2],\n      [9, 5, 6, 9, 6, 0, 0, 6, 2],\n      [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8],\n      [1, 5, 6, 2, 1, 6],\n      [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6],\n      [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0],\n      [0, 3, 8, 5, 6, 10],\n      [10, 5, 6],\n      [11, 5, 10, 7, 5, 11],\n      [11, 5, 10, 11, 7, 5, 8, 3, 0],\n      [5, 11, 7, 5, 10, 11, 1, 9, 0],\n      [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1],\n      [11, 1, 2, 11, 7, 1, 7, 5, 1],\n      [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11],\n      [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7],\n      [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n      [2, 5, 10, 2, 3, 5, 3, 7, 5],\n      [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5],\n      [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2],\n      [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2],\n      [1, 3, 5, 3, 7, 5],\n      [0, 8, 7, 0, 7, 1, 1, 7, 5],\n      [9, 0, 3, 9, 3, 5, 5, 3, 7],\n      [9, 8, 7, 5, 9, 7],\n      [5, 8, 4, 5, 10, 8, 10, 11, 8],\n      [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0],\n      [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5],\n      [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4],\n      [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8],\n      [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11],\n      [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5],\n      [9, 4, 5, 2, 11, 3],\n      [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4],\n      [5, 10, 2, 5, 2, 4, 4, 2, 0],\n      [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9],\n      [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2],\n      [8, 4, 5, 8, 5, 3, 3, 5, 1],\n      [0, 4, 5, 1, 0, 5],\n      [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5],\n      [9, 4, 5],\n      [4, 11, 7, 4, 9, 11, 9, 10, 11],\n      [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11],\n      [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11],\n      [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4],\n      [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2],\n      [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3],\n      [11, 7, 4, 11, 4, 2, 2, 4, 0],\n      [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n      [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9],\n      [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7],\n      [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10],\n      [1, 10, 2, 8, 7, 4],\n      [4, 9, 1, 4, 1, 7, 7, 1, 3],\n      [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1],\n      [4, 0, 3, 7, 4, 3],\n      [4, 8, 7],\n      [9, 10, 8, 10, 11, 8],\n      [3, 0, 9, 3, 9, 11, 11, 9, 10],\n      [0, 1, 10, 0, 10, 8, 8, 10, 11],\n      [3, 1, 10, 11, 3, 10],\n      [1, 2, 11, 1, 11, 9, 9, 11, 8],\n      [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9],\n      [0, 2, 11, 8, 0, 11],\n      [3, 2, 11],\n      [2, 3, 8, 2, 8, 10, 10, 8, 9],\n      [9, 10, 2, 0, 9, 2],\n      [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8],\n      [1, 10, 2],\n      [1, 3, 8, 9, 1, 8],\n      [0, 9, 1],\n      [0, 3, 8],\n      []]\n  , cubeVerts = [\n     [0,0,0]\n    ,[1,0,0]\n    ,[1,1,0]\n    ,[0,1,0]\n    ,[0,0,1]\n    ,[1,0,1]\n    ,[1,1,1]\n    ,[0,1,1]]\n  , edgeIndex = [ [0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7] ];\n\nreturn function(data, dims) {\n  var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = new Int32Array(3);\n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //For each cell, compute cube mask\n    var cube_index = 0;\n    for(var i=0; i<8; ++i) {\n      var v = cubeVerts[i]\n        , s = data[n + v[0] + dims[0] * (v[1] + dims[1] * v[2])];\n      grid[i] = s;\n      cube_index |= (s > 0) ? 1 << i : 0;\n    }\n    //Compute vertices\n    var edge_mask = edgeTable[cube_index];\n    if(edge_mask === 0) {\n      continue;\n    }\n    for(var i=0; i<12; ++i) {\n      if((edge_mask & (1<<i)) === 0) {\n        continue;\n      }\n      edges[i] = vertices.length;\n      var nv = [0,0,0]\n        , e = edgeIndex[i]\n        , p0 = cubeVerts[e[0]]\n        , p1 = cubeVerts[e[1]]\n        , a = grid[e[0]]\n        , b = grid[e[1]]\n        , d = a - b\n        , t = 0;\n      if(Math.abs(d) > 1e-6) {\n        t = a / d;\n      }\n      for(var j=0; j<3; ++j) {\n        nv[j] = (x[j] + p0[j]) + t * (p1[j] - p0[j]);\n      }\n      vertices.push(nv);\n    }\n    //Add faces\n    var f = triTable[cube_index];\n    for(var i=0; i<f.length; i += 3) {\n      faces.push([edges[f[i]], edges[f[i+1]], edges[f[i+2]]]);\n    }\n  }\n  return { vertices: vertices, faces: faces };\n};\n})();\n\nif(exports) {\n  exports.mesher = MarchingCubes;\n}\n\n"
  },
  {
    "path": "MeshSimplify/js/marchingtetrahedra.js",
    "content": "/**\n * Marching Tetrahedra in Javascript\n *\n * Based on Paul Bourke's implementation\n *  http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\n *\n * (Several bug fixes were made to deal with oriented faces)\n *\n * Javascript port by Mikola Lysenko\n */\nvar MarchingTetrahedra = (function() {\nvar cube_vertices = [\n        [0,0,0]\n      , [1,0,0]\n      , [1,1,0]\n      , [0,1,0]\n      , [0,0,1]\n      , [1,0,1]\n      , [1,1,1]\n      , [0,1,1] ]\n  , tetra_list = [\n        [0,2,3,7]\n      , [0,6,2,7]\n      , [0,4,6,7]\n      , [0,6,1,2]\n      , [0,1,6,4]\n      , [5,6,1,4] ];\n\nreturn function(data, dims) {\n   \n   var vertices = []\n    , faces = []\n    , n = 0\n    , grid = new Float32Array(8)\n    , edges = new Int32Array(12)\n    , x = [0,0,0];\n    \n  function interp(i0, i1) {\n    var g0 = grid[i0]\n      , g1 = grid[i1]\n      , p0 = cube_vertices[i0]\n      , p1 = cube_vertices[i1]\n      , v  = [x[0], x[1], x[2]]\n      , t = g0 - g1;\n    if(Math.abs(t) > 1e-6) {\n      t = g0 / t;\n    }\n    for(var i=0; i<3; ++i) {\n      v[i] += p0[i] + t * (p1[i] - p0[i]);\n    }\n    vertices.push(v);\n    return vertices.length - 1;\n  }\n  \n  //March over the volume\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0])\n  for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n)\n  for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n) {\n    //Read in cube  \n    for(var i=0; i<8; ++i) {\n      grid[i] = data[n + cube_vertices[i][0] + dims[0] * (cube_vertices[i][1] + dims[1] * cube_vertices[i][2])];\n    }\n    for(var i=0; i<tetra_list.length; ++i) {\n      var T = tetra_list[i]\n        , triindex = 0;\n      if (grid[T[0]] < 0) triindex |= 1;\n      if (grid[T[1]] < 0) triindex |= 2;\n      if (grid[T[2]] < 0) triindex |= 4;\n      if (grid[T[3]] < 0) triindex |= 8;\n      \n      //Handle each case\n      switch (triindex) {\n        case 0x00:\n        case 0x0F:\n        break;\n        case 0x0E:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[3]) \n            , interp(T[0], T[2]) ]);\n        break;\n        case 0x01:\n          faces.push([ \n              interp(T[0], T[1])\n            , interp(T[0], T[2])\n            , interp(T[0], T[3])  ]);\n        break;\n        case 0x0D:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[2]) \n            , interp(T[1], T[3]) ]);\n        break;\n        case 0x02:\n          faces.push([ \n              interp(T[1], T[0])\n            , interp(T[1], T[3])\n            , interp(T[1], T[2]) ]);\n        break;\n        case 0x0C:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[1], T[3])\n              , interp(T[0], T[3])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x03:\n          faces.push([ \n                interp(T[1], T[2])\n              , interp(T[0], T[2])\n              , interp(T[0], T[3])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x04:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[1])\n              , interp(T[2], T[3]) ]);\n        break;\n        case 0x0B:\n          faces.push([ \n                interp(T[2], T[0])\n              , interp(T[2], T[3]) \n              , interp(T[2], T[1]) ]);\n        break;\n        case 0x05:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[1], T[2])\n              , interp(T[2], T[3])\n              , interp(T[0], T[3]) ]);\n        break;\n        case 0x0A:\n          faces.push([ \n                interp(T[0], T[1])\n              , interp(T[0], T[3])\n              , interp(T[2], T[3])\n              , interp(T[1], T[2]) ]);\n        break;\n        case 0x06:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[0], T[2])\n              , interp(T[0], T[1])\n              , interp(T[1], T[3]) ]);\n        break;\n        case 0x09:\n          faces.push([ \n                interp(T[2], T[3])\n              , interp(T[1], T[3])\n              , interp(T[0], T[1])\n              , interp(T[0], T[2]) ]);\n        break;\n        case 0x07:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[1])\n              , interp(T[3], T[2]) ]);\n        break;\n        case 0x08:\n          faces.push([ \n                interp(T[3], T[0])\n              , interp(T[3], T[2])\n              , interp(T[3], T[1]) ]);\n        break;\n      }\n    }\n  }\n  \n  return { vertices: vertices, faces: faces };\n}\n})();\n\n\nif(exports) {\n  exports.mesher = MarchingTetrahedra;\n}\n"
  },
  {
    "path": "MeshSimplify/js/montecarlo.js",
    "content": "function MonteCarloSimplification(mesh) {\n  return mesh;\n}\n"
  },
  {
    "path": "MeshSimplify/js/surfacenets.js",
    "content": "/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\nvar SurfaceNets = (function() {\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Int32Array(4096);\n\nreturn function(data, dims) {\n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = new Int32Array(3)\n    , R = new Int32Array([1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)])\n    , grid = new Float32Array(8)\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    buffer = new Int32Array(R[2] * 2);\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { vertices: vertices, faces: faces };\n};\n})();\n"
  },
  {
    "path": "MeshSimplify/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function triangle_wave(t) {\n    var it = Math.floor(t);\n    if(!!(it & 1)) {\n      return t - it;\n    }\n    return 1 - (t-it);\n  }\n  \n  function memoize(f) {\n    var cached = null;\n    return function() {\n      if(cached === null) { \n        cached = f();\n      }\n      return cached;\n    }\n  }\n  \n  function makeVolume(dims, f) {\n    return memoize(function() {\n      var res = new Array(3);\n      for(var i=0; i<3; ++i) {\n        res[i] = 2 + Math.ceil((dims[i][1] - dims[i][0]) / dims[i][2]);\n      }\n      var volume = new Float32Array(res[0] * res[1] * res[2])\n        , n = 0;\n      for(var k=0, z=dims[2][0]-dims[2][2]; k<res[2]; ++k, z+=dims[2][2])\n      for(var j=0, y=dims[1][0]-dims[1][2]; j<res[1]; ++j, y+=dims[1][2])\n      for(var i=0, x=dims[0][0]-dims[0][2]; i<res[0]; ++i, x+=dims[0][2], ++n) {\n        volume[n] = f(x,y,z);\n      }\n      return {volume: volume, dims:res};\n    });\n  }\n  \n  \n  result['Thin Plates'] = makeVolume(\n    [[1, 63, 1],\n     [1, 63, 1],\n     [1, 63, 1]],\n    function(x,y,z) {\n      var t = 7.0 * triangle_wave(x / 7.0) - 0.5;\n      if( x < 10 ) {\n        t = Math.max(t, 10-x);\n      }\n      if( y < 10 ) {\n        t = Math.max(t, 10-y);\n      }\n      if( z < 10 )  {\n        t = Math.max(t, 10-z);\n      }\n      if( x > 54 ) {\n        t = Math.max(t, x - 54);\n      }\n      if( y > 54 ) {\n        t = Math.max(t, y - 54);\n      }\n      if( z > 54 ) {\n        t = Math.max(t, z - 54);\n      }\n      return t;\n    }\n  );\n  \n\n  result['Sphere'] = makeVolume(\n    [[-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05],\n     [-1.55, 1.55, 0.05]],\n    function(x,y,z) {\n      var r = Math.sqrt(x*x + y*y + z*z);\n      return r - 0.64;\n    }\n  )\n\n  result['Torus'] = makeVolume(\n    [[-2.2, 2.2, 4.4 / 62.0],\n     [-2.2, 2.2, 4.4 / 62.0],\n     [-1.4, 1.4, 4.4 / 62.0]],\n    function(x,y,z) {\n      return Math.pow(1.0 - Math.sqrt(x*x + y*y), 2) + z*z - 0.25;\n    }\n  );\n  \n  \n  \n  result['Hyperelliptic'] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      return Math.pow( Math.pow(x, 6) + Math.pow(y, 6) + Math.pow(z, 6), 1.0/6.0 ) - 1.0;\n    }  \n  );\n  \n  result[\"Goursat's Surface\"] = makeVolume(\n    [[-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0],\n     [-3.0, 3.0, 6.0/62.0]],\n    function(x,y,z) {\n      return Math.pow(x,4) + Math.pow(y,4) + Math.pow(z,4) - 1.5 * (x*x  + y*y + z*z) + 1;\n    }\n  );\n  \n  result[\"Heart\"] = makeVolume(\n    [[-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0],\n     [-2.0, 2.0, 4.0/62.0]],\n    function(x,y,z) {\n      y *= 1.5;\n      z *= 1.5;\n      return Math.pow(2*x*x+y*y+2*z*z-1, 3) - 0.1 * z*z*y*y*y - y*y*y*x*x;\n    }\n  );\n  \n  result['Noise (Slow)'] = makeVolume(\n    [[-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0],\n     [-2.0, 2.0, 4.0/126.0]], \n    function(x,y,z) {\n      if(x < -1.0 || x > 1.0 ||\n         y < -1.0 || y > 1.0 ||\n         z < -1.0 || z > 1.0 ) {\n        return 0.6;   \n      }\n      return 0.6 - PerlinNoise.noise(4.0 * x, 4.0 * y, 4.0 * z);\n    }\n  );\n    \n  result['Asteroid (Slow)'] = makeVolume(\n    [[-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0],\n     [-1.5, 1.5, 3.0/94.0]],\n    function(x,y,z) {\n      return (x*x + y*y + z*z) - PerlinNoise.noise(x*2,y*2,z*2);\n    }\n  );\n  \n  result['Terrain (Slow)'] = makeVolume(\n    [[-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0],\n     [-1, 1, 1.0/62.0]],\n    function(x,y,z) {\n      return  y + PerlinNoise.noise(x*2+5,y*2+3,z*2+0.6);\n    }\n  );\n  \n  \n  result['Empty'] = function(){ return { volume: new Float32Array(32*32*32), dims:[32,32,32] } };\n  \n  return result;\n}\n"
  },
  {
    "path": "MeshSimplify/js/triangle_index.js",
    "content": "function TriangleIndex(mesh) {\n  \n}\n"
  },
  {
    "path": "MeshSimplify/vendor/dsp.js",
    "content": "/* \n *  DSP.js - a comprehensive digital signal processing  library for javascript\n * \n *  Created by Corban Brook <corbanbrook@gmail.com> on 2010-01-01.\n *  Copyright 2010 Corban Brook. All rights reserved.\n *\n */\n\n////////////////////////////////////////////////////////////////////////////////\n//                                  CONSTANTS                                 //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DSP is an object which contains general purpose utility functions and constants\n */\nvar DSP = {\n  // Channels\n  LEFT:           0,\n  RIGHT:          1,\n  MIX:            2,\n\n  // Waveforms\n  SINE:           1,\n  TRIANGLE:       2,\n  SAW:            3,\n  SQUARE:         4,\n\n  // Filters\n  LOWPASS:        0,\n  HIGHPASS:       1,\n  BANDPASS:       2,\n  NOTCH:          3,\n\n  // Window functions\n  BARTLETT:       1,\n  BARTLETTHANN:   2,\n  BLACKMAN:       3,\n  COSINE:         4,\n  GAUSS:          5,\n  HAMMING:        6,\n  HANN:           7,\n  LANCZOS:        8,\n  RECTANGULAR:    9,\n  TRIANGULAR:     10,\n\n  // Loop modes\n  OFF:            0,\n  FW:             1,\n  BW:             2,\n  FWBW:           3,\n\n  // Math\n  TWO_PI:         2*Math.PI\n};\n\n// Setup arrays for platforms which do not support byte arrays\nfunction setupTypedArray(name, fallback) {\n  // check if TypedArray exists\n  // typeof on Minefield and Chrome return function, typeof on Webkit returns object.\n  if (typeof this[name] !== \"function\" && typeof this[name] !== \"object\") {\n    // nope.. check if WebGLArray exists\n    if (typeof this[fallback] === \"function\" && typeof this[fallback] !== \"object\") {\n      this[name] = this[fallback];\n    } else {\n      // nope.. set as Native JS array\n      this[name] = function(obj) {\n        if (obj instanceof Array) {\n          return obj;\n        } else if (typeof obj === \"number\") {\n          return new Array(obj);\n        }\n      };\n    }\n  }\n}\n\nsetupTypedArray(\"Float32Array\", \"WebGLFloatArray\");\nsetupTypedArray(\"Int32Array\",   \"WebGLIntArray\");\nsetupTypedArray(\"Uint16Array\",  \"WebGLUnsignedShortArray\");\nsetupTypedArray(\"Uint8Array\",   \"WebGLUnsignedByteArray\");\n\n\n////////////////////////////////////////////////////////////////////////////////\n//                            DSP UTILITY FUNCTIONS                           //\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Inverts the phase of a signal\n *\n * @param {Array} buffer A sample buffer\n *\n * @returns The inverted sample buffer\n */\nDSP.invert = function(buffer) {\n  for (var i = 0, len = buffer.length; i < len; i++) {\n    buffer[i] *= -1;\n  }\n\n  return buffer;\n};\n\n/**\n * Converts split-stereo (dual mono) sample buffers into a stereo interleaved sample buffer\n *\n * @param {Array} left  A sample buffer\n * @param {Array} right A sample buffer\n *\n * @returns The stereo interleaved buffer\n */\nDSP.interleave = function(left, right) {\n  if (left.length !== right.length) {\n    throw \"Can not interleave. Channel lengths differ.\";\n  }\n \n  var stereoInterleaved = new Float32Array(left.length * 2);\n \n  for (var i = 0, len = left.length; i < len; i++) {\n    stereoInterleaved[2*i]   = left[i];\n    stereoInterleaved[2*i+1] = right[i];\n  }\n \n  return stereoInterleaved;\n};\n\n/**\n * Converts a stereo-interleaved sample buffer into split-stereo (dual mono) sample buffers\n *\n * @param {Array} buffer A stereo-interleaved sample buffer\n *\n * @returns an Array containing left and right channels\n */\nDSP.deinterleave = (function() {\n  var left, right, mix, deinterleaveChannel = []; \n\n  deinterleaveChannel[DSP.MIX] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      mix[i] = (buffer[2*i] + buffer[2*i+1]) / 2;\n    }\n    return mix;\n  };\n\n  deinterleaveChannel[DSP.LEFT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      left[i]  = buffer[2*i];\n    }\n    return left;\n  };\n\n  deinterleaveChannel[DSP.RIGHT] = function(buffer) {\n    for (var i = 0, len = buffer.length/2; i < len; i++) {\n      right[i]  = buffer[2*i+1];\n    }\n    return right;\n  };\n\n  return function(channel, buffer) { \n    left  = left  || new Float32Array(buffer.length/2);\n    right = right || new Float32Array(buffer.length/2);\n    mix   = mix   || new Float32Array(buffer.length/2);\n\n    if (buffer.length/2 !== left.length) {\n      left  = new Float32Array(buffer.length/2);\n      right = new Float32Array(buffer.length/2);\n      mix   = new Float32Array(buffer.length/2);\n    }\n\n    return deinterleaveChannel[channel](buffer);\n  };\n}());\n\n/**\n * Separates a channel from a stereo-interleaved sample buffer\n *\n * @param {Array}  buffer A stereo-interleaved sample buffer\n * @param {Number} channel A channel constant (LEFT, RIGHT, MIX)\n *\n * @returns an Array containing a signal mono sample buffer\n */\nDSP.getChannel = DSP.deinterleave;\n\n/**\n * Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible\n * to negate the second buffer while mixing and to perform a volume correction\n * on the final signal.\n *\n * @param {Array} sampleBuffer1 Array containing Float values or a Float32Array\n * @param {Array} sampleBuffer2 Array containing Float values or a Float32Array\n * @param {Boolean} negate When true inverts/flips the audio signal\n * @param {Number} volumeCorrection When you add multiple sample buffers, use this to tame your signal ;)\n *\n * @returns A new Float32Array interleaved buffer.\n */\nDSP.mixSampleBuffers = function(sampleBuffer1, sampleBuffer2, negate, volumeCorrection){\n  var outputSamples = new Float32Array(sampleBuffer1);\n\n  for(var i = 0; i<sampleBuffer1.length; i++){\n    outputSamples[i] += (negate ? -sampleBuffer2[i] : sampleBuffer2[i]) / volumeCorrection;\n  }\n \n  return outputSamples;\n}; \n\n// Biquad filter types\nDSP.LPF = 0;                // H(s) = 1 / (s^2 + s/Q + 1)\nDSP.HPF = 1;                // H(s) = s^2 / (s^2 + s/Q + 1)\nDSP.BPF_CONSTANT_SKIRT = 2; // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\nDSP.BPF_CONSTANT_PEAK = 3;  // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\nDSP.NOTCH = 4;              // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\nDSP.APF = 5;                // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\nDSP.PEAKING_EQ = 6;         // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\nDSP.LOW_SHELF = 7;          // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\nDSP.HIGH_SHELF = 8;         // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n\n// Biquad filter parameter types\nDSP.Q = 1;\nDSP.BW = 2; // SHARED with BACKWARDS LOOP MODE\nDSP.S = 3;\n\n// Find RMS of signal\nDSP.RMS = function(buffer) {\n  var total = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    total += buffer[i] * buffer[i];\n  }\n  \n  return Math.sqrt(total / n);\n};\n\n// Find Peak of signal\nDSP.Peak = function(buffer) {\n  var peak = 0;\n  \n  for (var i = 0, n = buffer.length; i < n; i++) {\n    peak = (Math.abs(buffer[i]) > peak) ? Math.abs(buffer[i]) : peak; \n  }\n  \n  return peak;\n};\n\n// Fourier Transform Module used by DFT, FFT, RFFT\nfunction FourierTransform(bufferSize, sampleRate) {\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.bandwidth  = 2 / bufferSize * sampleRate / 2;\n\n  this.spectrum   = new Float32Array(bufferSize/2);\n  this.real       = new Float32Array(bufferSize);\n  this.imag       = new Float32Array(bufferSize);\n\n  this.peakBand   = 0;\n  this.peak       = 0;\n\n  /**\n   * Calculates the *middle* frequency of an FFT band.\n   *\n   * @param {Number} index The index of the FFT band.\n   *\n   * @returns The middle frequency in Hz.\n   */\n  this.getBandFrequency = function(index) {\n    return this.bandwidth * index + this.bandwidth / 2;\n  };\n\n  this.calculateSpectrum = function() {\n    var spectrum  = this.spectrum,\n        real      = this.real,\n        imag      = this.imag,\n        bSi       = 2 / this.bufferSize,\n        sqrt      = Math.sqrt,\n        rval, \n        ival,\n        mag;\n\n    for (var i = 0, N = bufferSize/2; i < N; i++) {\n      rval = real[i];\n      ival = imag[i];\n      mag = bSi * sqrt(rval * rval + ival * ival);\n\n      if (mag > this.peak) {\n        this.peakBand = i;\n        this.peak = mag;\n      }\n\n      spectrum[i] = mag;\n    }\n  };\n}\n\n/**\n * DFT is a class for calculating the Discrete Fourier Transform of a signal.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction DFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  var N = bufferSize/2 * bufferSize;\n  var TWO_PI = 2 * Math.PI;\n\n  this.sinTable = new Float32Array(N);\n  this.cosTable = new Float32Array(N);\n\n  for (var i = 0; i < N; i++) {\n    this.sinTable[i] = Math.sin(i * TWO_PI / bufferSize);\n    this.cosTable[i] = Math.cos(i * TWO_PI / bufferSize);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer\n *\n * @returns The frequency spectrum array\n */\nDFT.prototype.forward = function(buffer) {\n  var real = this.real, \n      imag = this.imag,\n      rval,\n      ival;\n\n  for (var k = 0; k < this.bufferSize/2; k++) {\n    rval = 0.0;\n    ival = 0.0;\n\n    for (var n = 0; n < buffer.length; n++) {\n      rval += this.cosTable[k*n] * buffer[n];\n      ival += this.sinTable[k*n] * buffer[n];\n    }\n\n    real[k] = rval;\n    imag[k] = ival;\n  }\n\n  return this.calculateSpectrum();\n};\n\n\n/**\n * FFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\nfunction FFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n   \n  this.reverseTable = new Uint32Array(bufferSize);\n\n  var limit = 1;\n  var bit = bufferSize >> 1;\n\n  var i;\n\n  while (limit < bufferSize) {\n    for (i = 0; i < limit; i++) {\n      this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n    }\n\n    limit = limit << 1;\n    bit = bit >> 1;\n  }\n\n  this.sinTable = new Float32Array(bufferSize);\n  this.cosTable = new Float32Array(bufferSize);\n\n  for (i = 0; i < bufferSize; i++) {\n    this.sinTable[i] = Math.sin(-Math.PI/i);\n    this.cosTable[i] = Math.cos(-Math.PI/i);\n  }\n}\n\n/**\n * Performs a forward transform on the sample buffer.\n * Converts a time domain signal to frequency domain spectra.\n *\n * @param {Array} buffer The sample buffer. Buffer Length must be power of 2\n *\n * @returns The frequency spectrum array\n */\nFFT.prototype.forward = function(buffer) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      real            = this.real,\n      imag            = this.imag,\n      spectrum        = this.spectrum;\n\n  var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n  if (Math.pow(2, k) !== bufferSize) { throw \"Invalid buffer size, must be a power of 2.\"; }\n  if (bufferSize !== buffer.length)  { throw \"Supplied buffer is not the same size as defined FFT. FFT Size: \" + bufferSize + \" Buffer Size: \" + buffer.length; }\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    real[i] = buffer[reverseTable[i]];\n    imag[i] = 0;\n  }\n\n  while (halfSize < bufferSize) {\n    //phaseShiftStepReal = Math.cos(-Math.PI/halfSize);\n    //phaseShiftStepImag = Math.sin(-Math.PI/halfSize);\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    \n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  return this.calculateSpectrum();\n};\n\nFFT.prototype.inverse = function(real, imag) {\n  // Locally scope variables for speed up\n  var bufferSize      = this.bufferSize,\n      cosTable        = this.cosTable,\n      sinTable        = this.sinTable,\n      reverseTable    = this.reverseTable,\n      spectrum        = this.spectrum;\n     \n      real = real || this.real;\n      imag = imag || this.imag;\n\n  var halfSize = 1,\n      phaseShiftStepReal,\n      phaseShiftStepImag,\n      currentPhaseShiftReal,\n      currentPhaseShiftImag,\n      off,\n      tr,\n      ti,\n      tmpReal,\n      i;\n\n  for (i = 0; i < bufferSize; i++) {\n    imag[i] *= -1;\n  }\n\n  var revReal = new Float32Array(bufferSize);\n  var revImag = new Float32Array(bufferSize);\n \n  for (i = 0; i < real.length; i++) {\n    revReal[i] = real[reverseTable[i]];\n    revImag[i] = imag[reverseTable[i]];\n  }\n \n  real = revReal;\n  imag = revImag;\n\n  while (halfSize < bufferSize) {\n    phaseShiftStepReal = cosTable[halfSize];\n    phaseShiftStepImag = sinTable[halfSize];\n    currentPhaseShiftReal = 1;\n    currentPhaseShiftImag = 0;\n\n    for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n      i = fftStep;\n\n      while (i < bufferSize) {\n        off = i + halfSize;\n        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);\n        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);\n\n        real[off] = real[i] - tr;\n        imag[off] = imag[i] - ti;\n        real[i] += tr;\n        imag[i] += ti;\n\n        i += halfSize << 1;\n      }\n\n      tmpReal = currentPhaseShiftReal;\n      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);\n      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);\n    }\n\n    halfSize = halfSize << 1;\n  }\n\n  var buffer = new Float32Array(bufferSize); // this should be reused instead\n  for (i = 0; i < bufferSize; i++) {\n    buffer[i] = real[i] / bufferSize;\n  }\n\n  return buffer;\n};\n\n/**\n * RFFT is a class for calculating the Discrete Fourier Transform of a signal\n * with the Fast Fourier Transform algorithm.\n *\n * This method currently only contains a forward transform but is highly optimized.\n *\n * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2\n * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)\n *\n * @constructor\n */\n\n// lookup tables don't really gain us any speed, but they do increase\n// cache footprint, so don't use them in here\n\n// also we don't use sepearate arrays for real/imaginary parts\n\n// this one a little more than twice as fast as the one in FFT\n// however I only did the forward transform\n\n// the rest of this was translated from C, see http://www.jjj.de/fxt/\n// this is the real split radix FFT\n\nfunction RFFT(bufferSize, sampleRate) {\n  FourierTransform.call(this, bufferSize, sampleRate);\n\n  this.trans = new Float32Array(bufferSize);\n\n  this.reverseTable = new Uint32Array(bufferSize);\n\n  // don't use a lookup table to do the permute, use this instead\n  this.reverseBinPermute = function (dest, source) {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    dest[0] = source[0];\n\n    do {\n      r += halfSize;\n      dest[i] = source[r];\n      dest[r] = source[i];\n      \n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        dest[i]     = source[r]; \n        dest[r]     = source[i];\n\n        dest[nm1-i] = source[nm1-r]; \n        dest[nm1-r] = source[nm1-i];\n      }\n      i++;\n    } while (i < halfSize);\n    dest[nm1] = source[nm1];\n  };\n\n  this.generateReverseTable = function () {\n    var bufferSize  = this.bufferSize, \n        halfSize    = bufferSize >>> 1, \n        nm1         = bufferSize - 1, \n        i = 1, r = 0, h;\n\n    this.reverseTable[0] = 0;\n\n    do {\n      r += halfSize;\n      \n      this.reverseTable[i] = r;\n      this.reverseTable[r] = i;\n\n      i++;\n\n      h = halfSize << 1;\n      while (h = h >> 1, !((r ^= h) & h));\n\n      if (r >= i) { \n        this.reverseTable[i] = r;\n        this.reverseTable[r] = i;\n\n        this.reverseTable[nm1-i] = nm1-r;\n        this.reverseTable[nm1-r] = nm1-i;\n      }\n      i++;\n    } while (i < halfSize);\n\n    this.reverseTable[nm1] = nm1;\n  };\n\n  this.generateReverseTable();\n}\n\n\n// Ordering of output:\n//\n// trans[0]     = re[0] (==zero frequency, purely real)\n// trans[1]     = re[1]\n//             ...\n// trans[n/2-1] = re[n/2-1]\n// trans[n/2]   = re[n/2]    (==nyquist frequency, purely real)\n//\n// trans[n/2+1] = im[n/2-1]\n// trans[n/2+2] = im[n/2-2]\n//             ...\n// trans[n-1]   = im[1] \n\nRFFT.prototype.forward = function(buffer) {\n  var n         = this.bufferSize, \n      spectrum  = this.spectrum,\n      x         = this.trans, \n      TWO_PI    = 2*Math.PI,\n      sqrt      = Math.sqrt,\n      i         = n >>> 1,\n      bSi       = 2 / n,\n      n2, n4, n8, nn, \n      t1, t2, t3, t4, \n      i1, i2, i3, i4, i5, i6, i7, i8, \n      st1, cc1, ss1, cc3, ss3,\n      e, \n      a,\n      rval, ival, mag; \n\n  this.reverseBinPermute(x, buffer);\n\n  /*\n  var reverseTable = this.reverseTable;\n\n  for (var k = 0, len = reverseTable.length; k < len; k++) {\n    x[k] = buffer[reverseTable[k]];\n  }\n  */\n\n  for (var ix = 0, id = 4; ix < n; id *= 4) {\n    for (var i0 = ix; i0 < n; i0 += id) {\n      //sumdiff(x[i0], x[i0+1]); // {a, b}  <--| {a+b, a-b}\n      st1 = x[i0] - x[i0+1];\n      x[i0] += x[i0+1];\n      x[i0+1] = st1;\n    } \n    ix = 2*(id-1);\n  }\n\n  n2 = 2;\n  nn = n >>> 1;\n\n  while((nn = nn >>> 1)) {\n    ix = 0;\n    n2 = n2 << 1;\n    id = n2 << 1;\n    n4 = n2 >>> 2;\n    n8 = n2 >>> 3;\n    do {\n      if(n4 !== 1) {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4];\n          x[i4] -= x[i3];\n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n     \n          i1 += n8;\n          i2 += n8;\n          i3 += n8;\n          i4 += n8;\n         \n          //sumdiff(x[i3], x[i4], t1, t2); // {s, d}  <--| {a+b, a-b}\n          t1 = x[i3] + x[i4];\n          t2 = x[i3] - x[i4];\n         \n          t1 = -t1 * Math.SQRT1_2;\n          t2 *= Math.SQRT1_2;\n     \n          // sumdiff(t1, x[i2], x[i4], x[i3]); // {s, d}  <--| {a+b, a-b}\n          st1 = x[i2];\n          x[i4] = t1 + st1; \n          x[i3] = t1 - st1;\n          \n          //sumdiff3(x[i1], t2, x[i2]); // {a, b, d} <--| {a+b, b, a-b}\n          x[i2] = x[i1] - t2;\n          x[i1] += t2;\n        }\n      } else {\n        for(i0 = ix; i0 < n; i0 += id) {\n          i1 = i0;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n     \n          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}\n          t1 = x[i3] + x[i4]; \n          x[i4] -= x[i3];\n          \n          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i3] = x[i1] - t1; \n          x[i1] += t1;\n        }\n      }\n   \n      ix = (id << 1) - n2;\n      id = id << 2;\n    } while (ix < n);\n \n    e = TWO_PI / n2;\n\n    for (var j = 1; j < n8; j++) {\n      a = j * e;\n      ss1 = Math.sin(a);\n      cc1 = Math.cos(a);\n\n      //ss3 = sin(3*a); cc3 = cos(3*a);\n      cc3 = 4*cc1*(cc1*cc1-0.75);\n      ss3 = 4*ss1*(0.75-ss1*ss1);\n   \n      ix = 0; id = n2 << 1;\n      do {\n        for (i0 = ix; i0 < n; i0 += id) {\n          i1 = i0 + j;\n          i2 = i1 + n4;\n          i3 = i2 + n4;\n          i4 = i3 + n4;\n       \n          i5 = i0 + n4 - j;\n          i6 = i5 + n4;\n          i7 = i6 + n4;\n          i8 = i7 + n4;\n       \n          //cmult(c, s, x, y, &u, &v)\n          //cmult(cc1, ss1, x[i7], x[i3], t2, t1); // {u,v} <--| {x*c-y*s, x*s+y*c}\n          t2 = x[i7]*cc1 - x[i3]*ss1; \n          t1 = x[i7]*ss1 + x[i3]*cc1;\n          \n          //cmult(cc3, ss3, x[i8], x[i4], t4, t3);\n          t4 = x[i8]*cc3 - x[i4]*ss3; \n          t3 = x[i8]*ss3 + x[i4]*cc3;\n       \n          //sumdiff(t2, t4);   // {a, b} <--| {a+b, a-b}\n          st1 = t2 - t4;\n          t2 += t4;\n          t4 = st1;\n          \n          //sumdiff(t2, x[i6], x[i8], x[i3]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i6]; x[i8] = t2 + st1; x[i3] = t2 - st1;\n          x[i8] = t2 + x[i6]; \n          x[i3] = t2 - x[i6];\n         \n          //sumdiff_r(t1, t3); // {a, b} <--| {a+b, b-a}\n          st1 = t3 - t1;\n          t1 += t3;\n          t3 = st1;\n          \n          //sumdiff(t3, x[i2], x[i4], x[i7]); // {s, d}  <--| {a+b, a-b}\n          //st1 = x[i2]; x[i4] = t3 + st1; x[i7] = t3 - st1;\n          x[i4] = t3 + x[i2]; \n          x[i7] = t3 - x[i2];\n         \n          //sumdiff3(x[i1], t1, x[i6]);   // {a, b, d} <--| {a+b, b, a-b}\n          x[i6] = x[i1] - t1; \n          x[i1] += t1;\n          \n          //diffsum3_r(t4, x[i5], x[i2]); // {a, b, s} <--| {a, b-a, a+b}\n          x[i2] = t4 + x[i5]; \n          x[i5] -= t4;\n        }\n     \n        ix = (id << 1) - n2;\n        id = id << 2;\n   \n      } while (ix < n);\n    }\n  }\n\n  while (--i) {\n    rval = x[i];\n    ival = x[n-i-1];\n    mag = bSi * sqrt(rval * rval + ival * ival);\n\n    if (mag > this.peak) {\n      this.peakBand = i;\n      this.peak = mag;\n    }\n\n    spectrum[i] = mag;\n  }\n\n  spectrum[0] = bSi * x[0];\n\n  return spectrum;\n};\n\nfunction Sampler(file, bufferSize, sampleRate, playStart, playEnd, loopStart, loopEnd, loopMode) {\n  this.file = file;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  this.playStart  = playStart || 0; // 0%\n  this.playEnd    = playEnd   || 1; // 100%\n  this.loopStart  = loopStart || 0;\n  this.loopEnd    = loopEnd   || 1;\n  this.loopMode   = loopMode  || DSP.OFF;\n  this.loaded     = false;\n  this.samples    = [];\n  this.signal     = new Float32Array(bufferSize);\n  this.frameCount = 0;\n  this.envelope   = null;\n  this.amplitude  = 1;\n  this.rootFrequency = 110; // A2 110\n  this.frequency  = 550;\n  this.step       = this.frequency / this.rootFrequency;\n  this.duration   = 0;\n  this.samplesProcessed = 0;\n  this.playhead   = 0;\n \n  var audio = /* new Audio();*/ document.createElement(\"AUDIO\");\n  var self = this;\n \n  this.loadSamples = function(event) {\n    var buffer = DSP.getChannel(DSP.MIX, event.frameBuffer);\n    for ( var i = 0; i < buffer.length; i++) {\n      self.samples.push(buffer[i]);\n    }\n  };\n \n  this.loadComplete = function() {\n    // convert flexible js array into a fast typed array\n    self.samples = new Float32Array(self.samples);\n    self.loaded = true;\n  };\n \n  this.loadMetaData = function() {\n    self.duration = audio.duration;\n  };\n \n  audio.addEventListener(\"MozAudioAvailable\", this.loadSamples, false);\n  audio.addEventListener(\"loadedmetadata\", this.loadMetaData, false);\n  audio.addEventListener(\"ended\", this.loadComplete, false);\n  audio.muted = true;\n  audio.src = file;\n  audio.play();\n}\n\nSampler.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n  return this.signal;\n};\n\nSampler.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n \n  var loopWidth = this.playEnd * this.samples.length - this.playStart * this.samples.length;\n  var playStartSamples = this.playStart * this.samples.length; // ie 0.5 -> 50% of the length\n  var playEndSamples = this.playEnd * this.samples.length; // ie 0.5 -> 50% of the length\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    switch (this.loopMode) {\n      case DSP.OFF:\n        this.playhead = Math.round(this.samplesProcessed * this.step + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        } else {\n          this.signal[i] = 0;\n        }\n        break;\n     \n      case DSP.FW:\n        this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.BW:\n        this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n       \n      case DSP.FWBW:\n        if ( Math.floor(this.samplesProcessed * this.step / loopWidth) % 2 === 0 ) {\n          this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);\n        } else {\n          this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);\n        }  \n        if (this.playhead < (this.playEnd * this.samples.length) ) {\n          this.signal[i] = this.samples[this.playhead] * this.amplitude;\n        }\n        break;\n    }\n    this.samplesProcessed++;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nSampler.prototype.setFreq = function(frequency) {\n    var totalProcessed = this.samplesProcessed * this.step;\n    this.frequency = frequency;\n    this.step = this.frequency / this.rootFrequency;\n    this.samplesProcessed = Math.round(totalProcessed/this.step);\n};\n\nSampler.prototype.reset = function() {\n  this.samplesProcessed = 0;\n  this.playhead = 0;\n};\n\n/**\n * Oscillator class for generating and modifying signals\n *\n * @param {Number} type       A waveform constant (eg. DSP.SINE)\n * @param {Number} frequency  Initial frequency of the signal\n * @param {Number} amplitude  Initial amplitude of the signal\n * @param {Number} bufferSize Size of the sample buffer to generate\n * @param {Number} sampleRate The sample rate of the signal\n *\n * @contructor\n */\nfunction Oscillator(type, frequency, amplitude, bufferSize, sampleRate) {\n  this.frequency  = frequency;\n  this.amplitude  = amplitude;\n  this.bufferSize = bufferSize;\n  this.sampleRate = sampleRate;\n  //this.pulseWidth = pulseWidth;\n  this.frameCount = 0;\n \n  this.waveTableLength = 2048;\n\n  this.cyclesPerSample = frequency / sampleRate;\n\n  this.signal = new Float32Array(bufferSize);\n  this.envelope = null;\n\n  switch(parseInt(type, 10)) {\n    case DSP.TRIANGLE:\n      this.func = Oscillator.Triangle;\n      break;\n\n    case DSP.SAW:\n      this.func = Oscillator.Saw;\n      break;\n\n    case DSP.SQUARE:\n      this.func = Oscillator.Square;\n      break;\n\n    default:\n    case DSP.SINE:\n      this.func = Oscillator.Sine;\n      break;\n  }\n\n  this.generateWaveTable = function() {\n    Oscillator.waveTable[this.func] = new Float32Array(2048);\n    var waveTableTime = this.waveTableLength / this.sampleRate;\n    var waveTableHz = 1 / waveTableTime;\n\n    for (var i = 0; i < this.waveTableLength; i++) {\n      Oscillator.waveTable[this.func][i] = this.func(i * waveTableHz/this.sampleRate);\n    }\n  };\n\n  if ( typeof Oscillator.waveTable === 'undefined' ) {\n    Oscillator.waveTable = {};\n  }\n\n  if ( typeof Oscillator.waveTable[this.func] === 'undefined' ) {\n    this.generateWaveTable();\n  }\n \n  this.waveTable = Oscillator.waveTable[this.func];\n}\n\n/**\n * Set the amplitude of the signal\n *\n * @param {Number} amplitude The amplitude of the signal (between 0 and 1)\n */\nOscillator.prototype.setAmp = function(amplitude) {\n  if (amplitude >= 0 && amplitude <= 1) {\n    this.amplitude = amplitude;\n  } else {\n    throw \"Amplitude out of range (0..1).\";\n  }\n};\n  \n/**\n * Set the frequency of the signal\n *\n * @param {Number} frequency The frequency of the signal\n */  \nOscillator.prototype.setFreq = function(frequency) {\n  this.frequency = frequency;\n  this.cyclesPerSample = frequency / this.sampleRate;\n};\n     \n// Add an oscillator\nOscillator.prototype.add = function(oscillator) {\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //this.signal[i] += oscillator.valueAt(i);\n    this.signal[i] += oscillator.signal[i];\n  }\n \n  return this.signal;\n};\n     \n// Add a signal to the current generated osc signal\nOscillator.prototype.addSignal = function(signal) {\n  for ( var i = 0; i < signal.length; i++ ) {\n    if ( i >= this.bufferSize ) {\n      break;\n    }\n    this.signal[i] += signal[i];\n   \n    /*\n    // Constrain amplitude\n    if ( this.signal[i] > 1 ) {\n      this.signal[i] = 1;\n    } else if ( this.signal[i] < -1 ) {\n      this.signal[i] = -1;\n    }\n    */\n  }\n  return this.signal;\n};\n     \n// Add an envelope to the oscillator\nOscillator.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nOscillator.prototype.applyEnvelope = function() {\n  this.envelope.process(this.signal);\n};\n     \nOscillator.prototype.valueAt = function(offset) {\n  return this.waveTable[offset % this.waveTableLength];\n};\n     \nOscillator.prototype.generate = function() {\n  var frameOffset = this.frameCount * this.bufferSize;\n  var step = this.waveTableLength * this.frequency / this.sampleRate;\n  var offset;\n\n  for ( var i = 0; i < this.bufferSize; i++ ) {\n    //var step = (frameOffset + i) * this.cyclesPerSample % 1;\n    //this.signal[i] = this.func(step) * this.amplitude;\n    //this.signal[i] = this.valueAt(Math.round((frameOffset + i) * step)) * this.amplitude;\n    offset = Math.round((frameOffset + i) * step);\n    this.signal[i] = this.waveTable[offset % this.waveTableLength] * this.amplitude;\n  }\n\n  this.frameCount++;\n\n  return this.signal;\n};\n\nOscillator.Sine = function(step) {\n  return Math.sin(DSP.TWO_PI * step);\n};\n\nOscillator.Square = function(step) {\n  return step < 0.5 ? 1 : -1;\n};\n\nOscillator.Saw = function(step) {\n  return 2 * (step - Math.round(step));\n};\n\nOscillator.Triangle = function(step) {\n  return 1 - 4 * Math.abs(Math.round(step) - step);\n};\n\nOscillator.Pulse = function(step) {\n  // stub\n};\n \nfunction ADSR(attackLength, decayLength, sustainLevel, sustainLength, releaseLength, sampleRate) {\n  this.sampleRate = sampleRate;\n  // Length in seconds\n  this.attackLength  = attackLength;\n  this.decayLength   = decayLength;\n  this.sustainLevel  = sustainLevel;\n  this.sustainLength = sustainLength;\n  this.releaseLength = releaseLength;\n  this.sampleRate    = sampleRate;\n \n  // Length in samples\n  this.attackSamples  = attackLength  * sampleRate;\n  this.decaySamples   = decayLength   * sampleRate;\n  this.sustainSamples = sustainLength * sampleRate;\n  this.releaseSamples = releaseLength * sampleRate;\n \n  // Updates the envelope sample positions\n  this.update = function() {\n    this.attack         =                this.attackSamples;\n    this.decay          = this.attack  + this.decaySamples;\n    this.sustain        = this.decay   + this.sustainSamples;\n    this.release        = this.sustain + this.releaseSamples;\n  };\n \n  this.update();\n \n  this.samplesProcessed = 0;\n}\n\nADSR.prototype.noteOn = function() {\n  this.samplesProcessed = 0;\n  this.sustainSamples = this.sustainLength * this.sampleRate;\n  this.update();\n};\n\n// Send a note off when using a sustain of infinity to let the envelope enter the release phase\nADSR.prototype.noteOff = function() {\n  this.sustainSamples = this.samplesProcessed - this.decaySamples;\n  this.update();\n};\n\nADSR.prototype.processSample = function(sample) {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return sample * amplitude;\n};\n\nADSR.prototype.value = function() {\n  var amplitude = 0;\n\n  if ( this.samplesProcessed <= this.attack ) {\n    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));\n  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {\n    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));\n  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {\n    amplitude = this.sustainLevel;\n  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {\n    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));\n  }\n \n  return amplitude;\n};\n     \nADSR.prototype.process = function(buffer) {\n  for ( var i = 0; i < buffer.length; i++ ) {\n    buffer[i] *= this.value();\n\n    this.samplesProcessed++;\n  }\n \n  return buffer;\n};\n     \n     \nADSR.prototype.isActive = function() {\n  if ( this.samplesProcessed > this.release || this.samplesProcessed === -1 ) {\n    return false;\n  } else {\n    return true;\n  }\n};\n\nADSR.prototype.disable = function() {\n  this.samplesProcessed = -1;\n};\n \nfunction IIRFilter(type, cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n\n  switch(type) {\n    case DSP.LOWPASS:\n    case DSP.LP12:\n      this.func = new IIRFilter.LP12(cutoff, resonance, sampleRate);\n      break;\n  }\n}\n\nIIRFilter.prototype.__defineGetter__('cutoff',\n  function() {\n    return this.func.cutoff;\n  }\n);\n\nIIRFilter.prototype.__defineGetter__('resonance',\n  function() {\n    return this.func.resonance;\n  }\n);\n\nIIRFilter.prototype.set = function(cutoff, resonance) {\n  this.func.calcCoeff(cutoff, resonance);\n};\n\nIIRFilter.prototype.process = function(buffer) {\n  this.func.process(buffer);\n};\n\n// Add an envelope to the filter\nIIRFilter.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.func.addEnvelope(envelope);\n  } else {\n    throw \"Not an envelope.\";\n  }\n};\n\nIIRFilter.LP12 = function(cutoff, resonance, sampleRate) {\n  this.sampleRate = sampleRate;\n  this.vibraPos   = 0;\n  this.vibraSpeed = 0;\n  this.envelope = false;\n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.w = 2.0 * Math.PI * cutoff / this.sampleRate;\n    this.q = 1.0 - this.w / (2.0 * (resonance + 0.5 / (1.0 + this.w)) + this.w - 2.0);\n    this.r = this.q * this.q;\n    this.c = this.r + 1.0 - 2.0 * Math.cos(this.w) * this.q;\n   \n    this.cutoff = cutoff;\n    this.resonance = resonance;\n  };\n\n  this.calcCoeff(cutoff, resonance);\n\n  this.process = function(buffer) {\n    for ( var i = 0; i < buffer.length; i++ ) {\n      this.vibraSpeed += (buffer[i] - this.vibraPos) * this.c;\n      this.vibraPos   += this.vibraSpeed;\n      this.vibraSpeed *= this.r;\n   \n      /*\n      var temp = this.vibraPos;\n     \n      if ( temp > 1.0 ) {\n        temp = 1.0;\n      } else if ( temp < -1.0 ) {\n        temp = -1.0;\n      } else if ( temp != temp ) {\n        temp = 1;\n      }\n     \n      buffer[i] = temp;\n      */\n\n      if (this.envelope) {\n        buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (this.vibraPos * this.envelope.value());\n        this.envelope.samplesProcessed++;\n      } else {\n        buffer[i] = this.vibraPos;\n      }\n    }\n  };\n}; \n\nIIRFilter.LP12.prototype.addEnvelope = function(envelope) {\n  this.envelope = envelope;\n};\n\nfunction IIRFilter2(type, cutoff, resonance, sampleRate) {\n  this.type = type;\n  this.cutoff = cutoff;\n  this.resonance = resonance;\n  this.sampleRate = sampleRate;\n\n  this.f = Float32Array(4);\n  this.f[0] = 0.0; // lp\n  this.f[1] = 0.0; // hp\n  this.f[2] = 0.0; // bp\n  this.f[3] = 0.0; // br \n \n  this.calcCoeff = function(cutoff, resonance) {\n    this.freq = 2 * Math.sin(Math.PI * Math.min(0.25, cutoff/(this.sampleRate*2)));  \n    this.damp = Math.min(2 * (1 - Math.pow(resonance, 0.25)), Math.min(2, 2/this.freq - this.freq * 0.5));\n  };\n\n  this.calcCoeff(cutoff, resonance);\n}\n\nIIRFilter2.prototype.process = function(buffer) {\n  var input, output;\n  var f = this.f;\n\n  for ( var i = 0; i < buffer.length; i++ ) {\n    input = buffer[i];\n\n    // first pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output = 0.5 * f[this.type];\n\n    // second pass\n    f[3] = input - this.damp * f[2];\n    f[0] = f[0] + this.freq * f[2];\n    f[1] = f[3] - f[0];\n    f[2] = this.freq * f[1] + f[2];\n    output += 0.5 * f[this.type];\n\n    if (this.envelope) {\n      buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (output * this.envelope.value());\n      this.envelope.samplesProcessed++;\n    } else {\n      buffer[i] = output;\n    }\n  }\n};\n\nIIRFilter2.prototype.addEnvelope = function(envelope) {\n  if ( envelope instanceof ADSR ) {\n    this.envelope = envelope;\n  } else {\n    throw \"This is not an envelope.\";\n  }\n};\n\nIIRFilter2.prototype.set = function(cutoff, resonance) {\n  this.calcCoeff(cutoff, resonance);\n};\n\n\n\nfunction WindowFunction(type, alpha) {\n  this.alpha = alpha;\n \n  switch(type) {\n    case DSP.BARTLETT:\n      this.func = WindowFunction.Bartlett;\n      break;\n     \n    case DSP.BARTLETTHANN:\n      this.func = WindowFunction.BartlettHann;\n      break;\n     \n    case DSP.BLACKMAN:\n      this.func = WindowFunction.Blackman;\n      this.alpha = this.alpha || 0.16;\n      break;\n   \n    case DSP.COSINE:\n      this.func = WindowFunction.Cosine;\n      break;\n     \n    case DSP.GAUSS:\n      this.func = WindowFunction.Gauss;\n      this.alpha = this.alpha || 0.25;\n      break;\n     \n    case DSP.HAMMING:\n      this.func = WindowFunction.Hamming;\n      break;\n     \n    case DSP.HANN:\n      this.func = WindowFunction.Hann;\n      break;\n   \n    case DSP.LANCZOS:\n      this.func = WindowFunction.Lanczoz;\n      break;\n     \n    case DSP.RECTANGULAR:\n      this.func = WindowFunction.Rectangular;\n      break;\n     \n    case DSP.TRIANGULAR:\n      this.func = WindowFunction.Triangular;\n      break;\n  }\n}\n\nWindowFunction.prototype.process = function(buffer) {\n  var length = buffer.length;\n  for ( var i = 0; i < length; i++ ) {\n    buffer[i] *= this.func(length, i, this.alpha);\n  }\n  return buffer;\n};\n\nWindowFunction.Bartlett = function(length, index) {\n  return 2 / (length - 1) * ((length - 1) / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nWindowFunction.BartlettHann = function(length, index) {\n  return 0.62 - 0.48 * Math.abs(index / (length - 1) - 0.5) - 0.38 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Blackman = function(length, index, alpha) {\n  var a0 = (1 - alpha) / 2;\n  var a1 = 0.5;\n  var a2 = alpha / 2;\n\n  return a0 - a1 * Math.cos(DSP.TWO_PI * index / (length - 1)) + a2 * Math.cos(4 * Math.PI * index / (length - 1));\n};\n\nWindowFunction.Cosine = function(length, index) {\n  return Math.cos(Math.PI * index / (length - 1) - Math.PI / 2);\n};\n\nWindowFunction.Gauss = function(length, index, alpha) {\n  return Math.pow(Math.E, -0.5 * Math.pow((index - (length - 1) / 2) / (alpha * (length - 1) / 2), 2));\n};\n\nWindowFunction.Hamming = function(length, index) {\n  return 0.54 - 0.46 * Math.cos(DSP.TWO_PI * index / (length - 1));\n};\n\nWindowFunction.Hann = function(length, index) {\n  return 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));\n};\n\nWindowFunction.Lanczos = function(length, index) {\n  var x = 2 * index / (length - 1) - 1;\n  return Math.sin(Math.PI * x) / (Math.PI * x);\n};\n\nWindowFunction.Rectangular = function(length, index) {\n  return 1;\n};\n\nWindowFunction.Triangular = function(length, index) {\n  return 2 / length * (length / 2 - Math.abs(index - (length - 1) / 2));\n};\n\nfunction sinh (arg) {\n  // Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2 \n  //\n  // version: 1004.2314\n  // discuss at: http://phpjs.org/functions/sinh    // +   original by: Onno Marsman\n  // *     example 1: sinh(-0.9834330348825909);\n  // *     returns 1: -1.1497971402636502\n  return (Math.exp(arg) - Math.exp(-arg))/2;\n}\n\n/* \n *  Biquad filter\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\n// Implementation based on:\n// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt\nfunction Biquad(type, sampleRate) {\n  this.Fs = sampleRate;\n  this.type = type;  // type of the filter\n  this.parameterType = DSP.Q; // type of the parameter\n\n  this.x_1_l = 0;\n  this.x_2_l = 0;\n  this.y_1_l = 0;\n  this.y_2_l = 0;\n\n  this.x_1_r = 0;\n  this.x_2_r = 0;\n  this.y_1_r = 0;\n  this.y_2_r = 0;\n\n  this.b0 = 1;\n  this.a0 = 1;\n\n  this.b1 = 0;\n  this.a1 = 0;\n\n  this.b2 = 0;\n  this.a2 = 0;\n\n  this.b0a0 = this.b0 / this.a0;\n  this.b1a0 = this.b1 / this.a0;\n  this.b2a0 = this.b2 / this.a0;\n  this.a1a0 = this.a1 / this.a0;\n  this.a2a0 = this.a2 / this.a0;\n\n  this.f0 = 3000;   // \"wherever it's happenin', man.\"  Center Frequency or\n                    // Corner Frequency, or shelf midpoint frequency, depending\n                    // on which filter type.  The \"significant frequency\".\n\n  this.dBgain = 12; // used only for peaking and shelving filters\n\n  this.Q = 1;       // the EE kind of definition, except for peakingEQ in which A*Q is\n                    // the classic EE Q.  That adjustment in definition was made so that\n                    // a boost of N dB followed by a cut of N dB for identical Q and\n                    // f0/Fs results in a precisely flat unity gain filter or \"wire\".\n\n  this.BW = -3;     // the bandwidth in octaves (between -3 dB frequencies for BPF\n                    // and notch or between midpoint (dBgain/2) gain frequencies for\n                    // peaking EQ\n\n  this.S = 1;       // a \"shelf slope\" parameter (for shelving EQ only).  When S = 1,\n                    // the shelf slope is as steep as it can be and remain monotonically\n                    // increasing or decreasing gain with frequency.  The shelf slope, in\n                    // dB/octave, remains proportional to S for all other values for a\n                    // fixed f0/Fs and dBgain.\n\n  this.coefficients = function() {\n    var b = [this.b0, this.b1, this.b2];\n    var a = [this.a0, this.a1, this.a2];\n    return {b: b, a:a};\n  };\n\n  this.setFilterType = function(type) {\n    this.type = type;\n    this.recalculateCoefficients();\n  };\n\n  this.setSampleRate = function(rate) {\n    this.Fs = rate;\n    this.recalculateCoefficients();\n  };\n\n  this.setQ = function(q) {\n    this.parameterType = DSP.Q;\n    this.Q = Math.max(Math.min(q, 115.0), 0.001);\n    this.recalculateCoefficients();\n  };\n\n  this.setBW = function(bw) {\n    this.parameterType = DSP.BW;\n    this.BW = bw;\n    this.recalculateCoefficients();\n  };\n\n  this.setS = function(s) {\n    this.parameterType = DSP.S;\n    this.S = Math.max(Math.min(s, 5.0), 0.0001);\n    this.recalculateCoefficients();\n  };\n\n  this.setF0 = function(freq) {\n    this.f0 = freq;\n    this.recalculateCoefficients();\n  }; \n \n  this.setDbGain = function(g) {\n    this.dBgain = g;\n    this.recalculateCoefficients();\n  };\n\n  this.recalculateCoefficients = function() {\n    var A;\n    if (type === DSP.PEAKING_EQ || type === DSP.LOW_SHELF || type === DSP.HIGH_SHELF ) {\n      A = Math.pow(10, (this.dBgain/40));  // for peaking and shelving EQ filters only\n    } else {\n      A  = Math.sqrt( Math.pow(10, (this.dBgain/20)) );   \n    }\n\n    var w0 = DSP.TWO_PI * this.f0 / this.Fs;\n\n    var cosw0 = Math.cos(w0);\n    var sinw0 = Math.sin(w0);\n\n    var alpha = 0;\n   \n    switch (this.parameterType) {\n      case DSP.Q:\n        alpha = sinw0/(2*this.Q);\n        break;\n           \n      case DSP.BW:\n        alpha = sinw0 * sinh( Math.LN2/2 * this.BW * w0/sinw0 );\n        break;\n\n      case DSP.S:\n        alpha = sinw0/2 * Math.sqrt( (A + 1/A)*(1/this.S - 1) + 2 );\n        break;\n    }\n\n    /**\n        FYI: The relationship between bandwidth and Q is\n             1/Q = 2*sinh(ln(2)/2*BW*w0/sin(w0))     (digital filter w BLT)\n        or   1/Q = 2*sinh(ln(2)/2*BW)             (analog filter prototype)\n\n        The relationship between shelf slope and Q is\n             1/Q = sqrt((A + 1/A)*(1/S - 1) + 2)\n    */\n\n    var coeff;\n\n    switch (this.type) {\n      case DSP.LPF:       // H(s) = 1 / (s^2 + s/Q + 1)\n        this.b0 =  (1 - cosw0)/2;\n        this.b1 =   1 - cosw0;\n        this.b2 =  (1 - cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.HPF:       // H(s) = s^2 / (s^2 + s/Q + 1)\n        this.b0 =  (1 + cosw0)/2;\n        this.b1 = -(1 + cosw0);\n        this.b2 =  (1 + cosw0)/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2 * cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_SKIRT:       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)\n        this.b0 =   sinw0/2;\n        this.b1 =   0;\n        this.b2 =  -sinw0/2;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.BPF_CONSTANT_PEAK:       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\n        this.b0 =   alpha;\n        this.b1 =   0;\n        this.b2 =  -alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.NOTCH:     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.APF:       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\n        this.b0 =   1 - alpha;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 + alpha;\n        this.a0 =   1 + alpha;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha;\n        break;\n\n      case DSP.PEAKING_EQ:  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\n        this.b0 =   1 + alpha*A;\n        this.b1 =  -2*cosw0;\n        this.b2 =   1 - alpha*A;\n        this.a0 =   1 + alpha/A;\n        this.a1 =  -2*cosw0;\n        this.a2 =   1 - alpha/A;\n        break;\n\n      case DSP.LOW_SHELF:   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) - (A-1)*cosw0 + coeff);\n        this.b1 =  2*A*((A-1) - (A+1)*cosw0);\n        this.b2 =    A*((A+1) - (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) + (A-1)*cosw0 + coeff;\n        this.a1 =   -2*((A-1) + (A+1)*cosw0);\n        this.a2 =       (A+1) + (A-1)*cosw0 - coeff;\n        break;\n\n      case DSP.HIGH_SHELF:   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)\n        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );\n        this.b0 =    A*((A+1) + (A-1)*cosw0 + coeff);\n        this.b1 = -2*A*((A-1) + (A+1)*cosw0);\n        this.b2 =    A*((A+1) + (A-1)*cosw0 - coeff);\n        this.a0 =       (A+1) - (A-1)*cosw0 + coeff;\n        this.a1 =    2*((A-1) - (A+1)*cosw0);\n        this.a2 =       (A+1) - (A-1)*cosw0 - coeff;\n        break;\n    }\n   \n    this.b0a0 = this.b0/this.a0;\n    this.b1a0 = this.b1/this.a0;\n    this.b2a0 = this.b2/this.a0;\n    this.a1a0 = this.a1/this.a0;\n    this.a2a0 = this.a2/this.a0;\n  };\n\n  this.process = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n\n      for ( var i=0; i<buffer.length; i++ ) {\n        output[i] = this.b0a0*buffer[i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[i];\n      }\n\n      return output;\n  };\n\n  this.processStereo = function(buffer) {\n      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]\n      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]\n\n      var len = buffer.length;\n      var output = new Float32Array(len);\n     \n      for (var i = 0; i < len/2; i++) {\n        output[2*i] = this.b0a0*buffer[2*i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;\n        this.y_2_l = this.y_1_l;\n        this.y_1_l = output[2*i];\n        this.x_2_l = this.x_1_l;\n        this.x_1_l = buffer[2*i];\n\n        output[2*i+1] = this.b0a0*buffer[2*i+1] + this.b1a0*this.x_1_r + this.b2a0*this.x_2_r - this.a1a0*this.y_1_r - this.a2a0*this.y_2_r;\n        this.y_2_r = this.y_1_r;\n        this.y_1_r = output[2*i+1];\n        this.x_2_r = this.x_1_r;\n        this.x_1_r = buffer[2*i+1];\n      }\n\n      return output;\n  };\n}\n\n/* \n *  Magnitude to decibels\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  @buffer array of magnitudes to convert to decibels\n *\n *  @returns the array in decibels\n *\n */\nDSP.mag2db = function(buffer) {\n  var minDb = -120;\n  var minMag = Math.pow(10.0, minDb / 20.0);\n\n  var log = Math.log;\n  var max = Math.max;\n \n  var result = Float32Array(buffer.length);\n  for (var i=0; i<buffer.length; i++) {\n    result[i] = 20.0*log(max(buffer[i], minMag));\n  }\n\n  return result;\n};\n\n/* \n *  Frequency response\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n *  Calculates the frequency response at the given points.\n *\n *  @b b coefficients of the filter\n *  @a a coefficients of the filter\n *  @w w points (normally between -PI and PI) where to calculate the frequency response\n *\n *  @returns the frequency response in magnitude\n *\n */\nDSP.freqz = function(b, a, w) {\n  var i, j;\n\n  if (!w) {\n    w = Float32Array(200);\n    for (i=0;i<w.length; i++) {\n      w[i] = DSP.TWO_PI/w.length * i - Math.PI;\n    }\n  }\n\n  var result = Float32Array(w.length);\n \n  var sqrt = Math.sqrt;\n  var cos = Math.cos;\n  var sin = Math.sin;\n \n  for (i=0; i<w.length; i++) {\n    var numerator = {real:0.0, imag:0.0};\n    for (j=0; j<b.length; j++) {\n      numerator.real += b[j] * cos(-j*w[i]);\n      numerator.imag += b[j] * sin(-j*w[i]);\n    }\n\n    var denominator = {real:0.0, imag:0.0};\n    for (j=0; j<a.length; j++) {\n      denominator.real += a[j] * cos(-j*w[i]);\n      denominator.imag += a[j] * sin(-j*w[i]);\n    }\n \n    result[i] =  sqrt(numerator.real*numerator.real + numerator.imag*numerator.imag) / sqrt(denominator.real*denominator.real + denominator.imag*denominator.imag);\n  }\n\n  return result;\n};\n\n/* \n *  Graphical Equalizer\n *\n *  Implementation of a graphic equalizer with a configurable bands-per-octave\n *  and minimum and maximum frequencies\n * \n *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.\n *  Copyright 2010 Ricard Marxer. All rights reserved.\n *\n */\nfunction GraphicalEq(sampleRate) {\n  this.FS = sampleRate;\n  this.minFreq = 40.0;\n  this.maxFreq = 16000.0;\n\n  this.bandsPerOctave = 1.0;\n\n  this.filters = [];\n  this.freqzs = [];\n\n  this.calculateFreqzs = true;\n\n  this.recalculateFilters = function() {\n    var bandCount = Math.round(Math.log(this.maxFreq/this.minFreq) * this.bandsPerOctave/ Math.LN2);\n\n    this.filters = [];\n    for (var i=0; i<bandCount; i++) {\n      var freq = this.minFreq*(Math.pow(2, i/this.bandsPerOctave));\n      var newFilter = new Biquad(DSP.PEAKING_EQ, this.FS);\n      newFilter.setDbGain(0);\n      newFilter.setBW(1/this.bandsPerOctave);\n      newFilter.setF0(freq);\n      this.filters[i] = newFilter;\n      this.recalculateFreqz(i);\n    }\n  };\n\n  this.setMinimumFrequency = function(freq) {\n    this.minFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setMaximumFrequency = function(freq) {\n    this.maxFreq = freq;\n    this.recalculateFilters();\n  };\n\n  this.setBandsPerOctave = function(bands) {\n    this.bandsPerOctave = bands;\n    this.recalculateFilters();\n  };\n\n  this.setBandGain = function(bandIndex, gain) {\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds.\";\n    }\n\n    if (!gain) {\n      throw \"A gain must be passed.\";\n    }\n   \n    this.filters[bandIndex].setDbGain(gain);\n    this.recalculateFreqz(bandIndex);\n  };\n \n  this.recalculateFreqz = function(bandIndex) {\n    if (!this.calculateFreqzs) {\n      return;\n    }\n\n    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {\n      throw \"The band index of the graphical equalizer is out of bounds. \" + bandIndex + \" is out of [\" + 0 + \", \" + this.filters.length-1 + \"]\";\n    }\n       \n    if (!this.w) {\n      this.w = Float32Array(400);\n      for (var i=0; i<this.w.length; i++) {\n         this.w[i] = Math.PI/this.w.length * i;\n      }\n    }\n   \n    var b = [this.filters[bandIndex].b0, this.filters[bandIndex].b1, this.filters[bandIndex].b2];\n    var a = [this.filters[bandIndex].a0, this.filters[bandIndex].a1, this.filters[bandIndex].a2];\n\n    this.freqzs[bandIndex] = DSP.mag2db(DSP.freqz(b, a, this.w));\n  };\n\n  this.process = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].process(output);\n    }\n\n    return output;\n  };\n\n  this.processStereo = function(buffer) {\n    var output = buffer;\n\n    for (var i = 0; i < this.filters.length; i++) {\n      output = this.filters[i].processStereo(output);\n    }\n\n    return output;\n  };\n}\n\n/**\n * MultiDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/delay-firefox-audio-api/\n *\n * This is a delay that feeds it's own delayed signal back into its circular\n * buffer. Also known as a CombFilter.\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\nfunction MultiDelay(maxDelayInSamplesSize, delayInSamples, masterVolume, delayVolume) {\n  this.delayBufferSamples   = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer     = delayInSamples;\n  this.delayOutputPointer   = 0;\n \n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.delayVolume     = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nMultiDelay.prototype.setDelayInSamples = function (delayInSamples) {\n  this.delayInSamples = delayInSamples;\n \n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setMasterVolume = function(masterVolume) {\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the delay feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nMultiDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and adds the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nMultiDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = (this.delayBufferSamples[this.delayOutputPointer] === null ? 0.0 : this.delayBufferSamples[this.delayOutputPointer]);\n   \n    // Mix normal audio data with delayed audio\n    var sample = (delaySample * this.delayVolume) + samples[i];\n   \n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = sample;\n   \n    // Return the audio with delay mix\n    outputSamples[i] = sample * this.masterVolume;\n   \n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * SingleDelay effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: See usage in Reverb class\n *\n * This is a delay that does NOT feeds it's own delayed signal back into its \n * circular buffer, neither does it return the original signal. Also known as\n * an AllPassFilter(?).\n *\n * Compatible with interleaved stereo (or more channel) buffers and\n * non-interleaved mono buffers.\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)\n * @param {Number} delayInSamples Initial delay in samples\n * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n *\n * @constructor\n */\n\nfunction SingleDelay(maxDelayInSamplesSize, delayInSamples, delayVolume) {\n  this.delayBufferSamples = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay\n  this.delayInputPointer  = delayInSamples;\n  this.delayOutputPointer = 0;\n \n  this.delayInSamples     = delayInSamples;\n  this.delayVolume        = delayVolume;\n}\n\n/**\n * Change the delay time in samples.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nSingleDelay.prototype.setDelayInSamples = function(delayInSamples) {\n  this.delayInSamples = delayInSamples;\n  this.delayInputPointer = this.delayOutputPointer + delayInSamples;\n\n  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; \n  }\n};\n\n/**\n * Change the return signal volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nSingleDelay.prototype.setDelayVolume = function(delayVolume) {\n  this.delayVolume = delayVolume;\n};\n\n/**\n * Process a given interleaved or mono non-interleaved float value Array and\n * returns the delayed audio.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.\n */\nSingleDelay.prototype.process = function(samples) {\n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(samples.length);\n\n  for (var i=0; i<samples.length; i++) {\n\n    // Add audio data with the delay in the delay buffer\n    this.delayBufferSamples[this.delayInputPointer] = samples[i];\n   \n    // delayBufferSamples could contain initial NULL's, return silence in that case\n    var delaySample = this.delayBufferSamples[this.delayOutputPointer];\n\n    // Return the audio with delay mix\n    outputSamples[i] = delaySample * this.delayVolume;\n\n    // Manage circulair delay buffer pointers\n    this.delayInputPointer++;\n\n    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {\n      this.delayInputPointer = 0;\n    }\n     \n    this.delayOutputPointer++;\n\n    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {\n      this.delayOutputPointer = 0; \n    } \n  }\n \n  return outputSamples;\n};\n\n/**\n * Reverb effect by Almer Thie (http://code.almeros.com).\n * Copyright 2010 Almer Thie. All rights reserved.\n * Example: http://code.almeros.com/code-examples/reverb-firefox-audio-api/\n *\n * This reverb consists of 6 SingleDelays, 6 MultiDelays and an IIRFilter2\n * for each of the two stereo channels.\n *\n * Compatible with interleaved stereo buffers only!\n *\n * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffers)\n * @param {Number} delayInSamples Initial delay in samples for internal (Single/Multi)delays\n * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} mixVolume Initial reverb signal mix volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} delayVolume Initial feedback delay volume for internal (Single/Multi)delays. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n * @param {Number} dampFrequency Initial low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n *\n * @constructor\n */\nfunction Reverb(maxDelayInSamplesSize, delayInSamples, masterVolume, mixVolume, delayVolume, dampFrequency) {\n  this.delayInSamples   = delayInSamples;\n  this.masterVolume     = masterVolume;\n  this.mixVolume       = mixVolume;\n  this.delayVolume     = delayVolume;\n  this.dampFrequency     = dampFrequency;\n \n  this.NR_OF_MULTIDELAYS = 6;\n  this.NR_OF_SINGLEDELAYS = 6;\n \n  this.LOWPASSL = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n  this.LOWPASSR = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);\n \n  this.singleDelays = [];\n  \n  var i, delayMultiply;\n\n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i] = new SingleDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.delayVolume);\n  }\n \n  this.multiDelays = [];\n\n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2... \n    this.multiDelays[i] = new MultiDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.masterVolume, this.delayVolume);\n  }\n}\n\n/**\n * Change the delay time in samples as a base for all delays.\n *\n * @param {Number} delayInSamples Delay in samples\n */\nReverb.prototype.setDelayInSamples = function (delayInSamples){\n  this.delayInSamples = delayInSamples;\n\n  var i, delayMultiply;\n \n  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {\n    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...\n    this.singleDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n   \n  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {\n    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2...\n    this.multiDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );\n  }\n};\n\n/**\n * Change the master volume.\n *\n * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMasterVolume = function (masterVolume){\n  this.masterVolume = masterVolume;\n};\n\n/**\n * Change the reverb signal mix level.\n *\n * @param {Number} mixVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setMixVolume = function (mixVolume){\n  this.mixVolume = mixVolume;\n};\n\n/**\n * Change all delays feedback volume.\n *\n * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)\n */\nReverb.prototype.setDelayVolume = function (delayVolume){\n  this.delayVolume = delayVolume;\n \n  var i;\n\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    this.singleDelays[i].setDelayVolume(this.delayVolume);\n  } \n \n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    this.multiDelays[i].setDelayVolume(this.delayVolume);\n  } \n};\n\n/**\n * Change the Low Pass filter frequency.\n *\n * @param {Number} dampFrequency low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)\n */\nReverb.prototype.setDampFrequency = function (dampFrequency){\n  this.dampFrequency = dampFrequency;\n \n  this.LOWPASSL.set(dampFrequency, 0);\n  this.LOWPASSR.set(dampFrequency, 0); \n};\n\n/**\n * Process a given interleaved float value Array and copies and adds the reverb signal.\n *\n * @param {Array} samples Array containing Float values or a Float32Array\n *\n * @returns A new Float32Array interleaved buffer.\n */\nReverb.prototype.process = function (interleavedSamples){ \n  // NB. Make a copy to put in the output samples to return.\n  var outputSamples = new Float32Array(interleavedSamples.length);\n \n  // Perform low pass on the input samples to mimick damp\n  var leftRightMix = DSP.deinterleave(interleavedSamples);\n  this.LOWPASSL.process( leftRightMix[DSP.LEFT] );\n  this.LOWPASSR.process( leftRightMix[DSP.RIGHT] ); \n  var filteredSamples = DSP.interleave(leftRightMix[DSP.LEFT], leftRightMix[DSP.RIGHT]);\n\n  var i;\n\n  // Process MultiDelays in parallel\n  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {\n    // Invert the signal of every even multiDelay\n    outputSamples = DSP.mixSampleBuffers(outputSamples, this.multiDelays[i].process(filteredSamples), 2%i === 0, this.NR_OF_MULTIDELAYS);\n  }\n \n  // Process SingleDelays in series\n  var singleDelaySamples = new Float32Array(outputSamples.length);\n  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {\n    // Invert the signal of every even singleDelay\n    singleDelaySamples = DSP.mixSampleBuffers(singleDelaySamples, this.singleDelays[i].process(outputSamples), 2%i === 0, 1);\n  }\n\n  // Apply the volume of the reverb signal\n  for (i = 0; i<singleDelaySamples.length; i++) {\n    singleDelaySamples[i] *= this.mixVolume;\n  }\n \n  // Mix the original signal with the reverb signal\n  outputSamples = DSP.mixSampleBuffers(singleDelaySamples, interleavedSamples, 0, 1);\n\n  // Apply the master volume to the complete signal\n  for (i = 0; i<outputSamples.length; i++) {\n    outputSamples[i] *= this.masterVolume;\n  }\n   \n  return outputSamples;\n};\n\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MeshSimplify/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MeshSimplify/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "MeshSimplify/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "MeshSimplify/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "MeshSimplify/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "MinecraftMeshes/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "MinecraftMeshes/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "MinecraftMeshes/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Minecraft Mesh Toolbox</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n\n    <!--Mesh algorithms-->\n    <script src=\"js/stupid.js\"></script>\n    <script src=\"js/culled.js\"></script>\n    <script src=\"js/greedy.js\"></script>\n\n    <script src=\"js/testdata.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tMinecraft Mesh Algorithm Tester\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Data source:</p>\n\t    <p><select id=\"datasource\"></select></p>\n\t    <p>Mesher:</p>\n\t    <p><select id=\"mesher\"></select></p>\n\t    <p>Show facets: <input type=\"checkbox\" id=\"showfacets\" value=\"checked\" /></p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" value=\"checked\" /></p>\n\t    <p>Quad count: <input type=\"text\" id=\"quadcount\" value=\"0\" /> </p>\t    \t\n\t  </div> \n\t</div> \n\t\n\t<script type=\"text/javascript\">\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControl;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\tvar meshers = {\n\t\t    'Stupid': StupidMesh\n\t\t  , 'Culled': CulledMesh\n\t\t  , 'Greedy': GreedyMesh\n\t\t};\n\t\tvar testdata = {};\n\t\t\n\t\t\n\t\tfunction updateMesh() {\n\t\t\n\t\t  scene.remove( surfacemesh );\n\t\t  scene.remove( wiremesh );\n\t\t  \n      //Create surface mesh\n\t\t\tgeometry\t= new THREE.Geometry();\n\t\t\tvar material\t= new THREE.MeshNormalMaterial();\n\t\t\tsurfacemesh\t= new THREE.Mesh( geometry, material );\n\t\t\tsurfacemesh.doubleSided = true;\n\t\t\tvar wirematerial = new THREE.MeshBasicMaterial({\n\t\t\t    color : 0xffffff\n\t\t\t  , wireframe : true\n\t\t\t});\n\t\t\twiremesh = new THREE.Mesh(geometry, wirematerial);\n\t\t\twiremesh.doubleSided = true;\n\t\t\tscene.add( surfacemesh );\n\t\t\tscene.add( wiremesh );\t\t\t\n\t\t\n\t\t  var mesher = meshers[ document.getElementById(\"mesher\").value ]\n\t\t    , data   = testdata[ document.getElementById(\"datasource\").value ]\n        , result = mesher( data.voxels, data.dims );\n      document.getElementById(\"quadcount\").value = result.length;\n      geometry.vertices.length = 0;\n      geometry.faces.length = 0;\n      for(var i=0; i<result.length; ++i) {\n        var q = result[i]\n          , n = geometry.vertices.length;\n        for(var j=0; j<4; ++j) {\n          geometry.vertices.push(new THREE.Vector3(q[j][0], q[j][1], q[j][2]));\n        }\n        geometry.faces.push(new THREE.Face4(n, n+1, n+2, n+3));\n      }\n      geometry.computeFaceNormals();\n      \n      geometry.verticesNeedUpdate = true;\n      geometry.elementsNeedUpdate = true;\n      geometry.normalsNeedUpdate = true;\n      \n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n      \n      var bb = geometry.boundingBox;\n      wiremesh.position.x = surfacemesh.position.x = -(bb.max.x + bb.min.x) / 2.0;\n      wiremesh.position.y = surfacemesh.position.y = -(bb.max.y + bb.min.y) / 2.0;\n      wiremesh.position.z = surfacemesh.position.z = -(bb.max.z + bb.min.z) / 2.0;\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\t\t\t\t\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 40);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\t\t\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n\t\t\t// here you add your objects\n\t\t\t// - you will most likely replace this part by your own\n\t\t\tvar light\t= new THREE.AmbientLight( Math.random() * 0xffffff );\n\t\t\tscene.add( light );\n\t\t\tvar light\t= new THREE.DirectionalLight( Math.random() * 0xffffff );\n\t\t\tlight.position.set( Math.random(), Math.random(), Math.random() ).normalize();\n\t\t\tscene.add( light );\n\n      \n\t\t\t//Initialize dom elements\n\t\t\ttestdata = createTestData();\n\t\t\tvar ds = document.getElementById(\"datasource\");\n\t\t\tfor(var id in testdata) {\n\t\t\t  ds.add(new Option(id, id), null);\n\t\t\t}\n\t\t\tds.onchange = updateMesh;\n\t\t\tvar ms = document.getElementById(\"mesher\");\n\t\t\tfor(var alg in meshers) {\n\t\t\t  ms.add(new Option(alg, alg), null);\n\t\t\t}\n\t\t\tms.onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"showfacets\").checked = true;\n\t\t\tdocument.getElementById(\"showedges\").checked  = true;\n\t\t\t\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      surfacemesh.visible = document.getElementById(\"showfacets\").checked;\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "MinecraftMeshes/js/culled.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n//Naive meshing (with face culling)\nfunction CulledMesh(volume, dims) {\n  //Precalculate direction vectors for convenience\n  var dir = new Array(3);\n  for(var i=0; i<3; ++i) {\n    dir[i] = [[0,0,0], [0,0,0]];\n    dir[i][0][(i+1)%3] = 1;\n    dir[i][1][(i+2)%3] = 1;\n  }\n  //March over the volume\n  var quads = []\n    , x = [0,0,0]\n    , B = [[false,true]    //Incrementally update bounds (this is a bit ugly)\n          ,[false,true]\n          ,[false,true]]\n    , n = -dims[0]*dims[1];\n  for(           B[2]=[false,true],x[2]=-1; x[2]<dims[2]; B[2]=[true,(++x[2]<dims[2]-1)])\n  for(n-=dims[0],B[1]=[false,true],x[1]=-1; x[1]<dims[1]; B[1]=[true,(++x[1]<dims[1]-1)])\n  for(n-=1,      B[0]=[false,true],x[0]=-1; x[0]<dims[0]; B[0]=[true,(++x[0]<dims[0]-1)], ++n) {\n    //Read current voxel and 3 neighboring voxels using bounds check results\n    var p =   (B[0][0] && B[1][0] && B[2][0]) ? volume[n]                 : false\n      , b = [ (B[0][1] && B[1][0] && B[2][0]) ? volume[n+1]               : false\n            , (B[0][0] && B[1][1] && B[2][0]) ? volume[n+dims[0]]         : false\n            , (B[0][0] && B[1][0] && B[2][1]) ? volume[n+dims[0]*dims[1]] : false\n          ];\n    //Generate faces\n    for(var d=0; d<3; ++d)\n    if(p != b[d]) {\n      var t = [x[0],x[1],x[2]]\n        , u = dir[d][0]\n        , v = dir[d][1];\n      ++t[d];\n      quads.push([\n          [t[0],           t[1],           t[2]          ]\n        , [t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]\n        , [t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]\n        , [t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]\n      ]);\n    }\n  }\n  return quads;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes/js/greedy.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction GreedyMesh(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var quads = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k, l, w, h\n      , u = (d+1)%3\n      , v = (d+2)%3\n      , x = [0,0,0]\n      , q = [0,0,0]\n      , mask = new Int32Array(dims[u] * dims[v]);\n    q[d] = 1;\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      //Compute mask\n      var n = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v])\n      for(x[u]=0; x[u]<dims[u]; ++x[u]) {\n        mask[n++] =\n          (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : false) !=\n          (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : false);\n      }\n      //Increment x[d]\n      ++x[d];\n      //Generate mesh for mask using lexicographic ordering\n      n = 0;\n      for(j=0; j<dims[v]; ++j)\n      for(i=0; i<dims[u]; ) {\n        if(mask[n]) {\n          //Compute width\n          for(w=1; mask[n+w] && i+w<dims[u]; ++w) {\n          }\n          //Compute height (this is slightly awkward\n          var done = false;\n          for(h=1; j+h<dims[v]; ++h) {\n            for(k=0; k<w; ++k) {\n              if(!mask[n+k+h*dims[u]]) {\n                done = true;\n                break;\n              }\n            }\n            if(done) {\n              break;\n            }\n          }\n          //Add quad\n          x[u] = i;  x[v] = j;\n          var du = [0,0,0]; du[u] = w;\n          var dv = [0,0,0]; dv[v] = h;\n          quads.push([\n              [x[0],             x[1],             x[2]            ]\n            , [x[0]+du[0],       x[1]+du[1],       x[2]+du[2]      ]\n            , [x[0]+du[0]+dv[0], x[1]+du[1]+dv[1], x[2]+du[2]+dv[2]]\n            , [x[0]      +dv[0], x[1]      +dv[1], x[2]      +dv[2]]\n          ]);\n          //Zero-out mask\n          for(l=0; l<h; ++l)\n          for(k=0; k<w; ++k) {\n            mask[n+k+l*dims[u]] = false;\n          }\n          //Increment counters and continue\n          i += w; n += w;\n        } else {\n          ++i;    ++n;\n        }\n      }\n    }\n  }\n  return quads;\n}\n"
  },
  {
    "path": "MinecraftMeshes/js/stupid.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n//The stupidest possible way to generate a Minecraft mesh (I think)\nfunction StupidMesh(volume, dims) {\n  var quads = [], x = [0,0,0], n = 0;\n  for(x[2]=0; x[2]<dims[2]; ++x[2])\n  for(x[1]=0; x[1]<dims[1]; ++x[1])\n  for(x[0]=0; x[0]<dims[0]; ++x[0])\n  if(volume[n++]) {\n    for(var d=0; d<3; ++d) {\n      var t = [x[0], x[1], x[2]]\n        , u = [0,0,0]\n        , v = [0,0,0]; \n      u[(d+1)%3] = 1;\n      v[(d+2)%3] = 1;\n      for(var s=0; s<2; ++s) {\n        t[d] = x[d] + s;\n        quads.push([\n            [t[0],           t[1],           t[2]          ]\n          , [t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]\n          , [t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]\n          , [t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]\n        ]);\n      }\n    }\n  }\n  return quads;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function makeVoxels(l, h, f) {\n    var d = [ h[0]-l[0], h[1]-l[1], h[2]-l[2] ]\n      , v = new Array(d[0]*d[1]*d[2])\n      , n = 0;\n    for(var k=l[2]; k<h[2]; ++k)\n    for(var j=l[1]; j<h[1]; ++j)\n    for(var i=l[0]; i<h[0]; ++i, ++n) {\n      v[n] = f(i,j,k);\n    }\n    return {voxels:v, dims:d};\n  }\n    \n  for(var i=1; i<=16; i<<=1) {\n    result[i + 'x' + i + 'x' + i] = makeVoxels([0,0,0], [i,i,i], function() { return true; });\n  }\n\n  result['Hole'] = makeVoxels([0,0,0], [16,16,1], function(i,j,k) {\n    return Math.abs(i-7) > 3 || Math.abs(j-7) > 3;\n  });\n  \n  result['Boss'] = makeVoxels([0,0,0], [16,16,4], function(i,j,k) {\n    return (k == 0) ||\n      (Math.abs(i-4) < 2 && Math.abs(j-5) < 2 && k< 2) ||\n      (10 <= i && i < 14 && 2 <= j && j < 15);\n  });\n  \n  result['T-Shape'] = makeVoxels([0,0,0], [16,16,3], function(i,j,k) {\n    return (( 6 <= i && i < 10 && 2 <= j && j < 13) ||\n      ( 2 <= i && i < 14 && 8 <= j && j < 13));\n  });\n  \n  result['Clover'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    if(i == 0 && Math.abs(j-8) <= 2) {\n      return false;\n    } else if(i == 16 && Math.abs(j-8) <= 2) {\n      return false;\n    } else if(j == 0 && Math.abs(i-8) <= 2) {\n      return false;\n    } else if(j == 16 && Math.abs(i-8) <= 2) {\n      return false;\n    } else {\n      return true;\n    }\n  });\n  \n  result['Triangle'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    return (i < j);\n  });\n  \n  result['Saw'] = makeVoxels([0,0,0], [17,3,1], function(i,j,k) {\n    if( j > 0) {\n      return true;\n    }\n    return !!(i & 1);\n  });\n  \n  result['4Holes']  = makeVoxels([0,0,0], [7,7,1], function(i,j,k) {\n    if( (i == 2 && j == 1) ||\n        (i == 5 && j == 2) ||\n        (i == 1 && j == 4) ||\n        (i == 4 && j == 5) ) {\n      return false;    \n    }\n    return true;\n  });\n  \n  result[\"Matt's Example\"]  = makeVoxels([0,0,0], [4,5,1], function(i,j,k) {\n    if( (i == 1 && j == 1) ||\n        (i == 2 && j == 3) ) {\n      return false;    \n    }\n    return true;\n  });\n  \n  result['Checker'] = makeVoxels([0,0,0], [8,8,8], function(i,j,k) {\n    return !!((i+j+k)&1);\n  });\n  \n  result['Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.random() < 0.1;\n  });\n  \n  result['HollowCube'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return ( i < 1 || i >= 15 || j < 1 || j >= 15 || k < 1 || k >= 15 );\n  });\n  \n  result['Sphere'] = makeVoxels([-16,-16,-16], [16,16,16], function(i,j,k) {\n    return i*i+j*j+k*k <= 16*16\n  });\n\n  result['Hill'] = makeVoxels([-16, 0, -16], [16,16,16], function(i,j,k) {\n    return j <= 16 * Math.exp(-(i*i + k*k) / 64);\n  });\n  \n  result['Valley'] = makeVoxels([0,0,0], [32,32,32], function(i,j,k) {\n    return j <= (i*i + k*k) * 31 / (32*32*2) + 1;\n  });\n  \n  result['SineTerrain'] = makeVoxels([0,0,0], [32, 8, 32], function(i,j,k) {\n     return j <= 3.0 * Math.sin(Math.PI * i / 12.0 - Math.PI * k * 0.1) + 4.0;\n  });\n  \n  \n  \n  result['Empty'] = { voxels : [], dims : [0,0,0] };\n\n  return result;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "MinecraftMeshes/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "MinecraftMeshes/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes2/MIT-LICENSE.txt",
    "content": "THIS LICENSE IS FOR THE FRAMEWORK, NOT THE FILES IN JS/*\n\nCopyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "MinecraftMeshes2/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "MinecraftMeshes2/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/experiments.txt",
    "content": "node benchmark.js ./stupid.js 32 10 20\n0     6.95       0      0\n1  2733.65 3293184 823296\n2  2848.05 3292128 823032\n3  2727.35 3293184 823296\n4  2673.4  3289032 822258\n5  2729.5  3293184 823296\n6  2741.1  3293088 823272\n7  2687.75 3293184 823296\n8  2729.2  3286512 821628\n9  2682.4  3293184 823296\n10 2772.95 3293136 823284\n\n\n\nnode benchmark.js ./culled.js 32 10 20\n0, 81.8, 0, 0\n1, 129.05, 82488, 20622\n2, 147.85, 114696, 28674\n3, 166.5, 146016, 36504\n4, 180.8, 178792, 44698\n5, 206.1, 209256, 52314\n6, 208.45, 243672, 60918\n7, 258.85, 272304, 68076\n8, 267.6, 306640, 76660\n9, 278.45, 334968, 83742\n10, 297.15, 371496, 92874\n\n\nnode benchmark.js ./greedy.js 32 10 20\n0, 92.4, 0, 0\n1, 99.1, 20712, 5178\n2, 103.1, 44068, 11017\n3, 110.35, 61644, 15411\n4, 126, 87984, 21996\n5, 134.25, 102024, 25506\n6, 151.4, 129344, 32336\n7, 153.6, 142416, 35604\n8, 167.85, 172140, 43035\n9, 164.9, 182256, 45564\n10, 198.3, 213452, 53363\n\nnode benchmark.js ./monotone.js 32 10 20\n0, 203.8, 0, 0\n1, 221.55, 25372, 19563\n2, 234.6, 45462, 28410\n3, 261.3, 67574, 43233\n4, 283.85, 88570, 55712\n5, 302.6, 110558, 69507\n6, 332.2, 134578, 84174\n7, 355.4, 155760, 97736\n8, 373.3, 174672, 111557\n9, 400.75, 199214, 125565\n10, 437.5, 226628, 143088\n\n"
  },
  {
    "path": "MinecraftMeshes2/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Minecraft Mesh Toolbox (with colors)</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n\n    <!--Mesh algorithms-->\n    <script src=\"js/stupid.js\"></script>\n    <script src=\"js/culled.js\"></script>\n    <script src=\"js/greedy.js\"></script>\n    <script src=\"js/monotone.js\"></script>\n\n    <script src=\"js/testdata.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tMinecraft Mesh Algorithm Tester (version 2)\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Data source:</p>\n\t    <p><select id=\"datasource\"></select></p>\n\t    <p>Mesher:</p>\n\t    <p><select id=\"mesher\"></select></p>\n\t    <p>Show faces: <input type=\"checkbox\" id=\"showfacets\" value=\"checked\" /></p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" value=\"checked\" /></p>\n\t    <p>Vertex count: <input type=\"text\" id=\"vertcount\" value=\"0\" /> </p>\t    \t\n\t    <p>Face count: <input type=\"text\" id=\"facecount\" value=\"0\" /> </p>\t    \t\n\t  </div> \n\t</div> \n\t\n\t<script type=\"text/javascript\">\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControl;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\tvar meshers = {\n\t\t    'Stupid': StupidMesh\n\t\t  , 'Culled': CulledMesh\n\t\t  , 'Greedy': GreedyMesh\n\t\t  , 'Monotone': MonotoneMesh\n\t\t};\n\t\tvar testdata = {};\n\t\t\n\t\t\n\t\tfunction updateMesh() {\n\t\t\n\t\t  scene.remove( surfacemesh );\n\t\t  scene.remove( wiremesh );\n\t\t  \n\t\t\tgeometry\t= new THREE.Geometry();\t\t\n\t\t  var mesher = meshers[ document.getElementById(\"mesher\").value ]\n\t\t    , data   = testdata[ document.getElementById(\"datasource\").value ]\n        , result = mesher( data.voxels, data.dims );\n      document.getElementById(\"vertcount\").value = result.vertices.length;\n      document.getElementById(\"facecount\").value = result.faces.length;\n      geometry.vertices.length = 0;\n      geometry.faces.length = 0;\n      for(var i=0; i<result.vertices.length; ++i) {\n        var q = result.vertices[i];\n        geometry.vertices.push(new THREE.Vector3(q[0], q[1], q[2]));\n      }\n      for(var i=0; i<result.faces.length; ++i) {\n        var q = result.faces[i];\n        if(q.length === 5) {\n          var f = new THREE.Face4(q[0], q[1], q[2], q[3]);\n          f.color = new THREE.Color(q[4]);\n          f.vertexColors = [f.color,f.color,f.color,f.color];\n          geometry.faces.push(f);\n        } else if(q.length == 4) {\n          var f = new THREE.Face3(q[0], q[1], q[2]);\n          f.color = new THREE.Color(q[3]);\n          f.vertexColors = [f.color,f.color,f.color];\n          geometry.faces.push(f);\n        }\n      }\n      \n      geometry.computeFaceNormals();\n      \n      geometry.verticesNeedUpdate = true;\n      geometry.elementsNeedUpdate = true;\n      geometry.normalsNeedUpdate = true;\n      \n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n      \n      var bb = geometry.boundingBox;\n\n      \n       //Create surface mesh\n\t\t\tvar material\t= new THREE.MeshBasicMaterial({\n\t\t    vertexColors: true\n\t\t\t});\n\t\t\tsurfacemesh\t= new THREE.Mesh( geometry, material );\n\t\t\tsurfacemesh.doubleSided = false;\n\t\t\tvar wirematerial = new THREE.MeshBasicMaterial({\n\t\t\t    color : 0xffffff\n\t\t\t  , wireframe : true\n\t\t\t});\n\t\t\twiremesh = new THREE.Mesh(geometry, wirematerial);\n\t\t\twiremesh.doubleSided = true;\n\t\t\t\n\t\t\twiremesh.position.x = surfacemesh.position.x = -(bb.max.x + bb.min.x) / 2.0;\n      wiremesh.position.y = surfacemesh.position.y = -(bb.max.y + bb.min.y) / 2.0;\n      wiremesh.position.z = surfacemesh.position.z = -(bb.max.z + bb.min.z) / 2.0;\n      \n\t\t\tscene.add( surfacemesh );\n\t\t\tscene.add( wiremesh );\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\t\t\t\t\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 40);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\t\t\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n      \n\t\t\t//Initialize dom elements\n\t\t\ttestdata = createTestData();\n\t\t\tvar ds = document.getElementById(\"datasource\");\n\t\t\tfor(var id in testdata) {\n\t\t\t  ds.add(new Option(id, id), null);\n\t\t\t}\n\t\t\tds.onchange = updateMesh;\n\t\t\tvar ms = document.getElementById(\"mesher\");\n\t\t\tfor(var alg in meshers) {\n\t\t\t  ms.add(new Option(alg, alg), null);\n\t\t\t}\n\t\t\tms.onchange = updateMesh;\n\t\t\t\n\t\t\tdocument.getElementById(\"showfacets\").checked = true;\n\t\t\tdocument.getElementById(\"showedges\").checked  = true;\n\t\t\t\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      surfacemesh.visible = document.getElementById(\"showfacets\").checked;\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "MinecraftMeshes2/js/benchmark.js",
    "content": "var mesher = require(process.argv[2]).mesher\n  , res = parseInt(process.argv[3])\n  , max_freq = parseInt(process.argv[4])\n  , iter_count = parseInt(process.argv[5]);\n\nvar nr = 2*res + 1\n  , volume = new Int32Array(nr * nr * nr)\n  , dims   = new Int32Array([nr, nr, nr]);\n\nfunction init_volume(freq) {\n  var n = 0, s = 0.5 * freq * Math.PI / res;\n  for(var z=-res; z<=res; ++z)\n  for(var y=-res; y<=res; ++y)\n  for(var x=-res; x<=res; ++x, ++n) {\n    volume[n] = Math.sin(s * x) + Math.sin(s * y) + Math.sin(s * z) < 0 ? 1 : 0;\n  }\n}\n\n//Warm up run on noisy volume, try to get JIT to compile meser\ninit_volume(res / 4.0);\nfor(var i=0; i<iter_count; ++i) {\n  mesher(volume, dims);\n}\n\n//Do iterations\nfor(var f = 0; f <= max_freq; ++f) {\n  init_volume(f);\n  var start = (new Date()).getTime();\n  for(var i=0; i<iter_count; ++i) {\n    mesher(volume, dims);\n  }\n  var end = (new Date()).getTime();\n  var mesh = mesher(volume, dims);\n  console.log(f + \", \" + ((end-start) / iter_count) + \", \" + mesh.vertices.length + \", \" + mesh.faces.length);  \n}\n\n"
  },
  {
    "path": "MinecraftMeshes2/js/culled.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n//Naive meshing (with face culling)\nfunction CulledMesh(volume, dims) {\n  //Precalculate direction vectors for convenience\n  var dir = new Array(3);\n  for(var i=0; i<3; ++i) {\n    dir[i] = [[0,0,0], [0,0,0]];\n    dir[i][0][(i+1)%3] = 1;\n    dir[i][1][(i+2)%3] = 1;\n  }\n  //March over the volume\n  var vertices = []\n    , faces = []\n    , x = [0,0,0]\n    , B = [[false,true]    //Incrementally update bounds (this is a bit ugly)\n          ,[false,true]\n          ,[false,true]]\n    , n = -dims[0]*dims[1];\n  for(           B[2]=[false,true],x[2]=-1; x[2]<dims[2]; B[2]=[true,(++x[2]<dims[2]-1)])\n  for(n-=dims[0],B[1]=[false,true],x[1]=-1; x[1]<dims[1]; B[1]=[true,(++x[1]<dims[1]-1)])\n  for(n-=1,      B[0]=[false,true],x[0]=-1; x[0]<dims[0]; B[0]=[true,(++x[0]<dims[0]-1)], ++n) {\n    //Read current voxel and 3 neighboring voxels using bounds check results\n    var p =   (B[0][0] && B[1][0] && B[2][0]) ? volume[n]                 : 0\n      , b = [ (B[0][1] && B[1][0] && B[2][0]) ? volume[n+1]               : 0\n            , (B[0][0] && B[1][1] && B[2][0]) ? volume[n+dims[0]]         : 0\n            , (B[0][0] && B[1][0] && B[2][1]) ? volume[n+dims[0]*dims[1]] : 0\n          ];\n    //Generate faces\n    for(var d=0; d<3; ++d)\n    if((!!p) !== (!!b[d])) {\n      var s = !p ? 1 : 0;\n      var t = [x[0],x[1],x[2]]\n        , u = dir[d][s]\n        , v = dir[d][s^1];\n      ++t[d];\n      \n      var vertex_count = vertices.length;\n      vertices.push([t[0],           t[1],           t[2]          ]);\n      vertices.push([t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]);\n      vertices.push([t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]);\n      vertices.push([t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]);\n      faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, s ? b[d] : p]);\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n\n\nif(exports) {\n  exports.mesher = CulledMesh;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/js/greedy.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar GreedyMesh = (function() {\n//Cache buffer internally\nvar mask = new Int32Array(4096);\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k, l, w, h\n      , u = (d+1)%3\n      , v = (d+2)%3\n      , x = [0,0,0]\n      , q = [0,0,0];\n    if(mask.length < dims[u] * dims[v]) {\n      mask = new Int32Array(dims[u] * dims[v]);\n    }\n    q[d] = 1;\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      //Compute mask\n      var n = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v])\n      for(x[u]=0; x[u]<dims[u]; ++x[u], ++n) {\n        var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n          , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n        if((!!a) === (!!b) ) {\n          mask[n] = 0;\n        } else if(!!a) {\n          mask[n] = a;\n        } else {\n          mask[n] = -b;\n        }\n      }\n      //Increment x[d]\n      ++x[d];\n      //Generate mesh for mask using lexicographic ordering\n      n = 0;\n      for(j=0; j<dims[v]; ++j)\n      for(i=0; i<dims[u]; ) {\n        var c = mask[n];\n        if(!!c) {\n          //Compute width\n          for(w=1; c === mask[n+w] && i+w<dims[u]; ++w) {\n          }\n          //Compute height (this is slightly awkward\n          var done = false;\n          for(h=1; j+h<dims[v]; ++h) {\n            for(k=0; k<w; ++k) {\n              if(c !== mask[n+k+h*dims[u]]) {\n                done = true;\n                break;\n              }\n            }\n            if(done) {\n              break;\n            }\n          }\n          //Add quad\n          x[u] = i;  x[v] = j;\n          var du = [0,0,0]\n            , dv = [0,0,0]; \n          if(c > 0) {\n            dv[v] = h;\n            du[u] = w;\n          } else {\n            c = -c;\n            du[v] = h;\n            dv[u] = w;\n          }\n          var vertex_count = vertices.length;\n          vertices.push([x[0],             x[1],             x[2]            ]);\n          vertices.push([x[0]+du[0],       x[1]+du[1],       x[2]+du[2]      ]);\n          vertices.push([x[0]+du[0]+dv[0], x[1]+du[1]+dv[1], x[2]+du[2]+dv[2]]);\n          vertices.push([x[0]      +dv[0], x[1]      +dv[1], x[2]      +dv[2]]);\n          faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, c]);\n          \n          //Zero-out mask\n          for(l=0; l<h; ++l)\n          for(k=0; k<w; ++k) {\n            mask[n+k+l*dims[u]] = 0;\n          }\n          //Increment counters and continue\n          i += w; n += w;\n        } else {\n          ++i;    ++n;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\nif(exports) {\n  exports.mesher = GreedyMesh;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/js/greedy_tri.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar GreedyMesh = (function() {\n//Cache buffer internally\nvar mask = new Int32Array(4096);\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k, l, w, h\n      , u = (d+1)%3\n      , v = (d+2)%3\n      , x = [0,0,0]\n      , q = [0,0,0];\n    if(mask.length < dims[u] * dims[v]) {\n      mask = new Int32Array(dims[u] * dims[v]);\n    }\n    q[d] = 1;\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      //Compute mask\n      var n = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v])\n      for(x[u]=0; x[u]<dims[u]; ++x[u], ++n) {\n        var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n          , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n        if((!!a) === (!!b) ) {\n          mask[n] = 0;\n        } else if(!!a) {\n          mask[n] = a;\n        } else {\n          mask[n] = -b;\n        }\n      }\n      //Increment x[d]\n      ++x[d];\n      //Generate mesh for mask using lexicographic ordering\n      n = 0;\n      for(j=0; j<dims[v]; ++j)\n      for(i=0; i<dims[u]; ) {\n        var c = mask[n];\n        if(!!c) {\n          //Compute width\n          for(w=1; c === mask[n+w] && i+w<dims[u]; ++w) {\n          }\n          //Compute height (this is slightly awkward\n          var done = false;\n          for(h=1; j+h<dims[v]; ++h) {\n            for(k=0; k<w; ++k) {\n              if(c !== mask[n+k+h*dims[u]]) {\n                done = true;\n                break;\n              }\n            }\n            if(done) {\n              break;\n            }\n          }\n          //Add quad\n          x[u] = i;  x[v] = j;\n          var du = [0,0,0]\n            , dv = [0,0,0]; \n          if(c > 0) {\n            dv[v] = h;\n            du[u] = w;\n          } else {\n            c = -c;\n            du[v] = h;\n            dv[u] = w;\n          }\n          var vertex_count = vertices.length;\n          vertices.push([x[0],             x[1],             x[2]            ]);\n          vertices.push([x[0]+du[0],       x[1]+du[1],       x[2]+du[2]      ]);\n          vertices.push([x[0]+du[0]+dv[0], x[1]+du[1]+dv[1], x[2]+du[2]+dv[2]]);\n          vertices.push([x[0]      +dv[0], x[1]      +dv[1], x[2]      +dv[2]]);\n          faces.push([vertex_count, vertex_count+1, vertex_count+2, c]);\n          faces.push([vertex_count, vertex_count+2, vertex_count+3, c]);\n          \n          //Zero-out mask\n          for(l=0; l<h; ++l)\n          for(k=0; k<w; ++k) {\n            mask[n+k+l*dims[u]] = 0;\n          }\n          //Increment counters and continue\n          i += w; n += w;\n        } else {\n          ++i;    ++n;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\nif(exports) {\n  exports.mesher = GreedyMesh;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/js/monotone.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\"use strict\";\n\nvar MonotoneMesh = (function(){\n\nfunction MonotonePolygon(c, v, ul, ur) {\n  this.color  = c;\n  this.left   = [[ul, v]];\n  this.right  = [[ur, v]];\n};\n\nMonotonePolygon.prototype.close_off = function(v) {\n  this.left.push([ this.left[this.left.length-1][0], v ]);\n  this.right.push([ this.right[this.right.length-1][0], v ]);\n};\n\nMonotonePolygon.prototype.merge_run = function(v, u_l, u_r) {\n  var l = this.left[this.left.length-1][0]\n    , r = this.right[this.right.length-1][0]; \n  if(l !== u_l) {\n    this.left.push([ l, v ]);\n    this.left.push([ u_l, v ]);\n  }\n  if(r !== u_r) {\n    this.right.push([ r, v ]);\n    this.right.push([ u_r, v ]);\n  }\n};\n\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k\n      , u = (d+1)%3   //u and v are orthogonal directions to d\n      , v = (d+2)%3\n      , x = new Int32Array(3)\n      , q = new Int32Array(3)\n      , runs = new Int32Array(2 * (dims[u]+1))\n      , frontier = new Int32Array(dims[u])  //Frontier is list of pointers to polygons\n      , next_frontier = new Int32Array(dims[u])\n      , left_index = new Int32Array(2 * dims[v])\n      , right_index = new Int32Array(2 * dims[v])\n      , stack = new Int32Array(24 * dims[v])\n      , delta = [[0,0], [0,0]];\n    //q points along d-direction\n    q[d] = 1;\n    //Initialize sentinel\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      // --- Perform monotone polygon subdivision ---\n      var n = 0\n        , polygons = []\n        , nf = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v]) {\n        //Make one pass over the u-scan line of the volume to run-length encode polygon\n        var nr = 0, p = 0, c = 0;\n        for(x[u]=0; x[u]<dims[u]; ++x[u], p = c) {\n          //Compute the type for this face\n          var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n            , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n          c = a;\n          if((!a) === (!b)) {\n            c = 0;\n          } else if(!a) {\n            c = -b;\n          }\n          //If cell type doesn't match, start a new run\n          if(p !== c) {\n            runs[nr++] = x[u];\n            runs[nr++] = c;\n          }\n        }\n        //Add sentinel run\n        runs[nr++] = dims[u];\n        runs[nr++] = 0;\n        //Update frontier by merging runs\n        var fp = 0;\n        for(var i=0, j=0; i<nf && j<nr-2; ) {\n          var p    = polygons[frontier[i]]\n            , p_l  = p.left[p.left.length-1][0]\n            , p_r  = p.right[p.right.length-1][0]\n            , p_c  = p.color\n            , r_l  = runs[j]    //Start of run\n            , r_r  = runs[j+2]  //End of run\n            , r_c  = runs[j+1]; //Color of run\n          //Check if we can merge run with polygon\n          if(r_r > p_l && p_r > r_l && r_c === p_c) {\n            //Merge run\n            p.merge_run(x[v], r_l, r_r);\n            //Insert polygon into frontier\n            next_frontier[fp++] = frontier[i];\n            ++i;\n            j += 2;\n          } else {\n            //Check if we need to advance the run pointer\n            if(r_r <= p_r) {\n              if(!!r_c) {\n                var n_poly = new MonotonePolygon(r_c, x[v], r_l, r_r);\n                next_frontier[fp++] = polygons.length;\n                polygons.push(n_poly);\n              }\n              j += 2;\n            }\n            //Check if we need to advance the frontier pointer\n            if(p_r <= r_r) {\n              p.close_off(x[v]);\n              ++i;\n            }\n          }\n        }\n        //Close off any residual polygons\n        for(; i<nf; ++i) {\n          polygons[frontier[i]].close_off(x[v]);\n        }\n        //Add any extra runs to frontier\n        for(; j<nr-2; j+=2) {\n          var r_l  = runs[j]\n            , r_r  = runs[j+2]\n            , r_c  = runs[j+1];\n          if(!!r_c) {\n            var n_poly = new MonotonePolygon(r_c, x[v], r_l, r_r);\n            next_frontier[fp++] = polygons.length;\n            polygons.push(n_poly);\n          }\n        }\n        //Swap frontiers\n        var tmp = next_frontier;\n        next_frontier = frontier;\n        frontier = tmp;\n        nf = fp;\n      }\n      //Close off frontier\n      for(var i=0; i<nf; ++i) {\n        var p = polygons[frontier[i]];\n        p.close_off(dims[v]);\n      }\n      // --- Monotone subdivision of polygon is complete at this point ---\n      \n      x[d]++;\n      \n      //Now we just need to triangulate each monotone polygon\n      for(var i=0; i<polygons.length; ++i) {\n        var p = polygons[i]\n          , c = p.color\n          , flipped = false;\n        if(c < 0) {\n          flipped = true;\n          c = -c;\n        }\n        for(var j=0; j<p.left.length; ++j) {\n          left_index[j] = vertices.length;\n          var y = [0.0,0.0,0.0]\n            , z = p.left[j];\n          y[d] = x[d];\n          y[u] = z[0];\n          y[v] = z[1];\n          vertices.push(y);\n        }\n        for(var j=0; j<p.right.length; ++j) {\n          right_index[j] = vertices.length;\n          var y = [0.0,0.0,0.0]\n            , z = p.right[j];\n          y[d] = x[d];\n          y[u] = z[0];\n          y[v] = z[1];\n          vertices.push(y);\n        }\n        //Triangulate the monotone polygon\n        var bottom = 0\n          , top = 0\n          , l_i = 1\n          , r_i = 1\n          , side = true;  //true = right, false = left\n        \n        stack[top++] = left_index[0];\n        stack[top++] = p.left[0][0];\n        stack[top++] = p.left[0][1];\n        \n        stack[top++] = right_index[0];\n        stack[top++] = p.right[0][0];\n        stack[top++] = p.right[0][1];\n        \n        while(l_i < p.left.length || r_i < p.right.length) {\n          //Compute next side\n          var n_side = false;\n          if(l_i === p.left.length) {\n            n_side = true;\n          } else if(r_i !== p.right.length) {\n            var l = p.left[l_i]\n              , r = p.right[r_i];\n            n_side = l[1] > r[1];\n          }\n          var idx = n_side ? right_index[r_i] : left_index[l_i]\n            , vert = n_side ? p.right[r_i] : p.left[l_i];\n          if(n_side !== side) {\n            //Opposite side\n            while(bottom+3 < top) {\n              if(flipped === n_side) {\n                faces.push([ stack[bottom], stack[bottom+3], idx, c]);\n              } else {\n                faces.push([ stack[bottom+3], stack[bottom], idx, c]);              \n              }\n              bottom += 3;\n            }\n          } else {\n            //Same side\n            while(bottom+3 < top) {\n              //Compute convexity\n              for(var j=0; j<2; ++j)\n              for(var k=0; k<2; ++k) {\n                delta[j][k] = stack[top-3*(j+1)+k+1] - vert[k];\n              }\n              var det = delta[0][0] * delta[1][1] - delta[1][0] * delta[0][1];\n              if(n_side === (det > 0)) {\n                break;\n              }\n              if(det !== 0) {\n                if(flipped === n_side) {\n                  faces.push([ stack[top-3], stack[top-6], idx, c ]);\n                } else {\n                  faces.push([ stack[top-6], stack[top-3], idx, c ]);\n                }\n              }\n              top -= 3;\n            }\n          }\n          //Push vertex\n          stack[top++] = idx;\n          stack[top++] = vert[0];\n          stack[top++] = vert[1];\n          //Update loop index\n          if(n_side) {\n            ++r_i;\n          } else {\n            ++l_i;\n          }\n          side = n_side;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\nif(exports) {\n  exports.mesher = MonotoneMesh;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/js/stupid.js",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2012-2013 Mikola Lysenko\n//\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n//The stupidest possible way to generate a Minecraft mesh (I think)\nfunction StupidMesh(volume, dims) {\n  var vertices = [], faces = [], x = [0,0,0], n = 0;\n  for(x[2]=0; x[2]<dims[2]; ++x[2])\n  for(x[1]=0; x[1]<dims[1]; ++x[1])\n  for(x[0]=0; x[0]<dims[0]; ++x[0], ++n)\n  if(!!volume[n]) {\n    for(var d=0; d<3; ++d) {\n      var t = [x[0], x[1], x[2]]\n        , u = [0,0,0]\n        , v = [0,0,0];\n      u[(d+1)%3] = 1;\n      v[(d+2)%3] = 1;\n      for(var s=0; s<2; ++s) {\n        t[d] = x[d] + s;\n        var tmp = u;\n        u = v;\n        v = tmp;\n        var vertex_count = vertices.length;\n        vertices.push([t[0],           t[1],           t[2]          ]);\n        vertices.push([t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]);\n        vertices.push([t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]);\n        vertices.push([t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]);\n        faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, volume[n]]);\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n\n\nif(exports) {\n  exports.mesher = StupidMesh;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function makeVoxels(l, h, f) {\n    var d = [ h[0]-l[0], h[1]-l[1], h[2]-l[2] ]\n      , v = new Int32Array(d[0]*d[1]*d[2])\n      , n = 0;\n    for(var k=l[2]; k<h[2]; ++k)\n    for(var j=l[1]; j<h[1]; ++j)\n    for(var i=l[0]; i<h[0]; ++i, ++n) {\n      v[n] = f(i,j,k);\n    }\n    return {voxels:v, dims:d};\n  }\n  \n  var colorTab = [\n    0xff0000,\n    0x00ff00,\n    0x0000ff,\n    0xff00ff,\n    0xffff00,\n    0x00ffff,\n    0x000001,\n    0xffffff\n  ];\n  \n  \n  \n  for(var i=1,c=0; i<=16; i<<=1,++c) {\n    result[i + 'x' + i + 'x' + i] = makeVoxels([0,0,0], [i,i,i], function() { return colorTab[c]; });\n  }\n  \n  result['Sphere'] = makeVoxels([-16,-16,-16], [16,16,16], function(i,j,k) {\n    return i*i+j*j+k*k <= 16*16 ? 0x113344 : 0;\n  });\n\n  result['I-Shape'] = makeVoxels([0,-1,-1], [1,2,2], function(i,j,k) {\n    if((j === -1 && k === 0) ||\n       (j ===  1 && k === 0) ) {\n      return 0;   \n    }\n    return 1;\n  });\n  \n  result['Tiny Button'] = makeVoxels([-1,-1,-1],[1,2,2], function(i,j,k) {\n    if(i === 0) {\n      return (j === 0 && k === 0) ? 0xff0000 : 0;\n    }\n    return 1;\n  });\n  \n\n  result['Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.random() < 0.1 ? Math.random() * 0xffffff : 0;\n  });\n\n  result['Dense Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.round(Math.random() * 0xffffff);\n  });\n\n  result['16 Color Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.random() < 0.1 ? colorTab[Math.floor(Math.random() * colorTab.length)] : 0;\n  });\n\n  result['Hole'] = makeVoxels([0,0,0], [16,16,1], function(i,j,k) {\n    return Math.abs(i-7) > 3 || Math.abs(j-7) > 3 ? 1 : 0;\n  });\n  \n  result['Boss'] = makeVoxels([0,0,0], [16,16,4], function(i,j,k) {\n    if(k === 0) {\n      return 0x0000ff;\n    } else if(Math.abs(i-4) < 2 && Math.abs(j-5) < 2 && k< 2) {\n      return 0x00ff00;\n    } else if(10 <= i && i < 14 && 2 <= j && j < 15) {\n      return 0xff0000;\n    }\n    return 0;\n  });\n  \n  result['T-Shape'] = makeVoxels([0,0,0], [16,16,3], function(i,j,k) {\n    return (( 6 <= i && i < 10 && 2 <= j && j < 13) ||\n      ( 2 <= i && i < 14 && 8 <= j && j < 13)) ? 0xcc00dd : 0;\n  });\n  \n  result['HollowCube'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    if(i < 1) {\n      return 0xff0000;\n    } else if(i >= 15) {\n      return 0x00ffff;\n    } else if(j < 1) {\n      return 0x00ff00;\n    } else if(j >= 15) {\n      return 0xff00ff;\n    } else if(k < 1) {\n      return 0x0000ff;\n    } else if(k >= 15) {\n      return 0xffff00;\n    } else {\n      return 0;\n    }\n  });\n  \n  \n  result['Clover'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    if(i == 0 && Math.abs(j-8) <= 2) {\n      return 0;\n    } else if(i == 16 && Math.abs(j-8) <= 2) {\n      return 0;\n    } else if(j == 0 && Math.abs(i-8) <= 2) {\n      return 0;\n    } else if(j == 16 && Math.abs(i-8) <= 2) {\n      return 0;\n    } else {\n      return 0x10de60;\n    }\n  });\n  \n  result['Triangle'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    return (i < j) ? 0xff00ff : 0;\n  });\n  \n  \n  result['Saw'] = makeVoxels([0,0,0], [17,3,1], function(i,j,k) {\n    if( j > 0 || !!(i & 1) ) {\n      return 0x00ffff;\n    }\n    return 0;\n  });\n  \n  result['4Dots']  = makeVoxels([0,0,0], [7,7,1], function(i,j,k) {\n    if( (i == 2 && j == 1) ||\n        (i == 5 && j == 2) ||\n        (i == 1 && j == 4) ||\n        (i == 4 && j == 5) ) {\n      return 0x00ff;    \n    }\n    return 0xeedd00;\n  });\n  \n  result['Checker'] = makeVoxels([0,0,0], [8,8,8], function(i,j,k) {\n    return !!((i+j+k)&1) ? (((i^j^k)&2) ? 1 : 0xffffff) : 0;\n  });\n  \n  \n  result[\"Matt's Example\"]  = makeVoxels([0,0,0], [4,5,1], function(i,j,k) {\n    if( (i == 1 && j == 1) ||\n        (i == 2 && j == 3) ) {\n      return 0xee5533;\n    }\n    return 0x128844;\n  });\n  \n  result['Benchmark (SLOW!)'] = makeVoxels([-32, -32, -32], [33, 33, 33], function(x, y, z) {\n    var s = 2.0 * Math.PI / 32.0;\n    return Math.sin(s * x) + Math.sin(s * y) + Math.sin(s * z) < 0 ? 1 : 0;\n  });\n  \n  result['Hill'] = makeVoxels([-16, 0, -16], [16,16,16], function(i,j,k) {\n    return j <= 16 * Math.exp(-(i*i + k*k) / 64) ? 0x118822 : 0;\n  });\n  \n  result['Valley'] = makeVoxels([0,0,0], [32,32,32], function(i,j,k) {\n    return j <= (i*i + k*k) * 31 / (32*32*2) + 1 ? 0x118822 : 0;\n  });\n  \n  result['Hilly Terrain'] = makeVoxels([0, 0, 0], [32,32,32], function(i,j,k) {\n    var h0 = 3.0 * Math.sin(Math.PI * i / 12.0 - Math.PI * k * 0.1) + 27;    \n    if(j > h0+1) {\n      return 0;\n    }\n    if(h0 <= j) {\n      return 0x23dd31;\n    }\n    var h1 = 2.0 * Math.sin(Math.PI * i * 0.25 - Math.PI * k * 0.3) + 20;\n    if(h1 <= j) {\n      return 0x964B00;\n    }\n    if(2 < j) {\n      return Math.random() < 0.1 ? 0x222222 : 0xaaaaaa;\n    }\n    return 0xff0000;\n  });\n  \n  result['Empty'] = { voxels : [], dims : [0,0,0] };\n\n  return result;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "MinecraftMeshes2/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "Pictures/test_smooth.py",
    "content": "import scipy as sp\nimport scipy.ndimage as ndi\nimport pylab\n\nx0 = 0.25\nmu = 5.0\n\n\ndef sigmoid(t):\n  return 1.0 / (1.0 + sp.exp(-mu * t))\n  \ndef shallow(t):\n  return sigmoid(t) - sigmoid(x0)\n  \ndef steep(t):\n  return sigmoid(t - 2.0*x0) - sigmoid(-x0)\n\ndef zero(t):\n  return 0.0 * t\n\ndef downsample(f):\n  for sigma in range(1, 10):\n    pylab.plot(ndi.gaussian_filter1d(f, 2.0 ** sigma))\n    \ndef make_gif():\n  t = sp.arange(-5.0, 5.0, 0.01)\n  for sigma in range(1, 10):\n    pylab.clf()\n    pylab.figtext(0,0,\"sigma={0}\".format(2**sigma))\n    pylab.axis([-6.0, 6.0, -1.1, 1.1])\n    A = ndi.gaussian_filter(shallow(t), 2.0**sigma)\n    B = ndi.gaussian_filter(steep(t), 2.0**sigma)\n    pylab.plot(t, A, 'b')\n    pylab.plot(t, B, 'r')\n    #pylab.plot(t, -1.0 * (A > 0), 'b')\n    #pylab.plot(t, (B > 0), 'r')\n    pylab.plot(t, zero(t), 'k')\n    pylab.draw()\n    pylab.savefig('frame{0}'.format(sigma))\n\n\ndef make_gif2():\n  t = sp.arange(-5.0, 5.0, 0.01)\n  for sigma in range(1, 10):\n    pylab.clf()\n    pylab.figtext(0,0,\"sigma={0}\".format(2**sigma))\n    pylab.axis([-6.0, 6.0, -1.1, 1.1])\n    A = ndi.median_filter(shallow(t), 2.0**sigma)\n    B = ndi.median_filter(steep(t), 2.0**sigma)\n    pylab.plot(t, A, 'b')\n    pylab.plot(t, B, 'r')\n    pylab.plot(t, -1.0 * (A > 0), 'b')\n    pylab.plot(t, (B > 0), 'r')\n    pylab.plot(t, zero(t), 'k')\n    pylab.draw()\n    pylab.savefig('frame{0}'.format(sigma))\n\n\n"
  },
  {
    "path": "Resources/brep.js",
    "content": "//Javascript Tools for BREPS\n// Author: Mikola Lysenko\n// License: MIT\n// Copyright 2012\n\nvar BREP = {};\n(function(exports) {\n\"use strict\";\n\nvar EPSILON = 1e-6;\n\n//Compute the star of each vertex in the mesh\nfunction compute_stars(mesh) {\n  var stars = new Array(mesh.positions.length);\n  for(var i=0; i<links.length; ++i) {\n    stars[i] = [];\n  }\n  var faces = mesh.faces;\n  for(var i=0; i<faces.length; ++i) {  \n    var f = faces[i];\n    for(var j=0; j<f.length; ++j) {\n      stars[f[j]].push(i);\n    }\n  }\n  return stars;\n};\n\n//Unordered pair\nfunction UOPair(a, b) {\n  if(a < b) {\n    this.a = a;\n    this.b = b;  \n  } else {\n    this.a = b;\n    this.b = a;\n  }\n}\n\n//Compares s vs t\nfunction compare_uopair(s, t) {\n  var da = s.a - t.a;\n  if(da !== 0) {\n    return da;\n  }\n  return s.b - t.b;\n}\n\n//Merge loops a and b in place.  This is not very efficient --Mik\nfunction merge_loops(a, b) {\n  var result = a.concat(b);\n  result.sort(compare_uopair);\n  for(var i=result.length-1; i>0; --i) {\n    if(compare_uopair(result[i], result[i-1]) === 0) {\n      result.splice(i, 1);\n    }\n  }\n  return result;\n}\n\n//Extract face loop\nfunction face_loop(f) {\n  var loop = [];\n  var p = f[f.length-1];\n  for(var j=0; j<f.length; ++j) {\n    var n = f[j];\n    loop.push(new Pair(n, p));\n    p = n;\n  }\n  loop.sort(compare_uopair);\n  return loop;\n}\n\n\n//Computes the link (boundary of star) of each vertex in a mesh\nfunction compute_links(mesh) {\n  var loops = new Array(mesh.positions.length);\n  for(var i=0; i<loops.length; ++i) {\n    loops[i] = [ ];\n  }\n  \n  //First build link by uniting all chains incident to vertex\n  var faces = mesh.faces;\n  var max_loop = 0;\n  for(var i=0; i<faces.length; ++i) {  \n    var f = faces[i];\n    var loop = face_loop(f);\n    for(var j=0; j<f.length; ++j) {\n      loops[f[j]] = merge_loops(loops[f[j]], f);\n      max_loop = Math.max(loops[f[j]].length, max_loop);\n    }\n  }\n  \n  //Then fuse chains by fixing an orientation\n  var links = new Array(loops.length);\n  var visited = new Array(max_loop);\n  for(var i=0; i<loops.length; ++i) {\n    var l = loops[i];\n    \n    for(var j=0; j<l.length; ++j) {\n      visited[j] = false;\n    }\n    \n    var link = [ l[0].a, l[0].b ];\n    var cur  = l[0].b;\n    var done = false;\n    visited[0] = false;\n    \n    while(!done) {\n      done = true;\n      for(var j=1; j<l.length; ++j) {\n        if(visited[j]) {\n          continue;\n        }\n        var E = l[j];\n        if(E.a === cur) {\n          cur = E.b;\n          done = false;\n          link.push(cur);\n        } else if(E.b === cur) {\n          cur = E.a;\n          done = false;\n          link.push(cur);\n        }\n      }\n    }\n\n    links[i] = link;\n  }\n  \n  return links;\n};\n\n\n//Estimate the normals of a mesh\nfunction estimate_normals(mesh) {\n  \n  var positions = mesh.positions;\n  var faces     = mesh.faces;\n  var N         = positions.length;\n  var normals   = new Array(N);\n  \n  //Initialize normal array\n  for(var i=0; i<N; ++i) {\n    normals[i] = [0.0, 0.0, 0.0];\n  }\n  \n  //Walk over all the faces and add per-vertex contribution to normal weights\n  for(var i=0; i<faces.length; ++i) {\n    var f = faces[i];\n    var p = 0;\n    var c = f[f.length-1];\n    var n = f[0];\n    for(var j=0; j<f.length; ++j) {\n    \n      //Shift indices back\n      p = c;\n      c = n;\n      n = f[(j+1) % f.length];\n    \n      var v0 = positions[p];\n      var v1 = positions[c];\n      var v2 = positions[n];\n      \n      //Compute arc lengths\n      var d01 = new Array(3);\n      var m01 = 0.0;\n      var d21 = new Array(3);\n      var m21 = 0.0;\n      for(var k=0; k<3; ++k) {\n        d01[k] = v0[k]  - v1[k];\n        m01   += d01[k] * d01[k];\n        d21[k] = v2[k]  - v1[k];\n        m21   += d21[k] * d21[k];\n      }\n\n      //Accumulate values in normal\n      if(m01 * m21 > EPSILON) {\n        var norm = normals[c];\n        var w = 1.0 / Math.sqrt(m01 * m21);\n        for(var k=0; k<3; ++k) {\n          var u = (k+1)%3;\n          var v = (k+2)%3;\n          norm[k] += w * (d01[u] * d21[v] - d01[v] * d21[u]);\n        }\n      }\n    }\n  }\n  \n  //Scale all normals to unit length\n  for(var i=0; i<N; ++i) {\n    var norm = normals[i];\n    var m = 0.0;\n    for(var k=0; k<3; ++k) {\n      m += norm[k] * norm[k];\n    }\n    if(m > EPSILON) {\n      var w = 1.0 / Math.sqrt(m);\n      for(var k=0; k<3; ++k) {\n        norm[k] *= w;\n      }\n    } else {\n      for(var k=0; k<3; ++k) {\n        norm[k] = 0.0;\n      }\n    }\n  }\n\n  //Return the resulting set of patches\n  return normals;\n}\n\n//Set up exports\nexports.compute_stars    = compute_stars;\nexports.compute_links    = compute_links;\nexports.estimate_normals = estimate_normals;\n\n})(typeof(exports) !== \"undefined\" ? exports : BREP);\n"
  },
  {
    "path": "Resources/glow_shell.js",
    "content": "// GLOW PingPong shell\n// Author: Mikola Lysenko (http://0fps.net)\n// License: BSD\n\n//Simulation parameters\nvar parameters = {\n    WIDTH: 256,\n    HEIGHT: 256,\n    STEPS_PER_FRAME: 1\n};\n\n// create a context and set white background\nvar context;\ntry {\n  context = new GLOW.Context();\n} catch(e) {\n  alert(\"WebGL not supported :-(\");\n  return;\n}\n\n//Make sure we have floating point textures\nif( !context.enableExtension( \"OES_texture_float\" )) {\n  alert( \"No support for float textures!\" );\n  return;\n}\n\n//Set up basic parameters\ncontext.setupClear( { red: 1, green: 1, blue: 1 } );\n\n// attach the context's DOM element\nvar container = document.getElementById(\"container\");\ncontainer.appendChild( context.domElement );\n\n\n//Allocate ping pong buffers\nvar buffer_dims = [ parameters.WIDTH, parameters.HEIGHT ];\nvar buffers = new Array(2);\nvar current_buffer = 0;\n(function() { \n    \n    \n    //Create initial conditions\n    var initial_state = new Float32Array(buffer_dims[0] * buffer_dims[1] * 4);\n    var ptr = 0;\n    for(var j=0; j<buffer_dims[1]; ++j) {\n        for(var i=0; i<buffer_dims[0]; ++i) {\n            var x = Math.floor(i / parameters.INNER_RADIUS);\n            var y = Math.floor(j / parameters.INNER_RADIUS);\n            \n            initial_state[ptr]   = Math.random();\n            initial_state[ptr+1] = 0;\n            initial_state[ptr+2] = 0;\n            initial_state[ptr+3] = 0;\n            ptr += 4;\n        }\n    }\n    \n    //Initialize buffers\n    for(var i=0; i<buffers.length; ++i) {\n        buffers[i] = new GLOW.FBO( {\n            width:     buffer_dims[0],\n            height:    buffer_dims[1],\n            magFilter: GL.NEAREST,\n            minFilter: GL.NEAREST,\n            type:      GL.FLOAT,\n            wrapS:     GL.REPEAT,\n            wrapT:     GL.REPEAT,\n            depth:     false, \n            stencil:   false,\n            data:      initial_state\n        } );\n    }\n})();\n\n\n//Pass through vertex shader\nvar passThruVS = [\n    \"attribute  vec3    vertices;\",\n    \"attribute  vec2    uvs;\",\n    \"varying    vec2    uv;\",\n\n    \"void main(void)\",\n    \"{\",\n        \"uv = uvs;\",\n        \"gl_Position = vec4( vertices.x, vertices.y, 1.0, 1.0 );\",\n    \"}\"\n].join( \"\\n\" );\n\n//Common shader functions\nvar commonFS = [\n\n    \"#ifdef GL_ES\",\n        \"precision highp float;\",\n    \"#endif\",        \n    \"#define PI 3.14159265358979323846264\",\n    (function() {\n        var result = [];\n        for(var param in parameters) {\n            result.push(\"#define \" + param + \" \" + parameters[param]);\n        }\n        return result.join(\"\\n\");\n    })(),\n    \n    \"uniform    sampler2D    state;\",\n    \"varying    vec2         uv;\",\n    \"float f(vec2 p) {\",\n        \"return texture2D(state, uv+(p/vec2(WIDTH, HEIGHT))).r;\",\n    \"}\"\n    \n].join(\"\\n\");\n\n//Updates the state of a single cell\nvar updateStateFS = [\n    \n    commonFS,\n    \n    \"void main( void ) {\",\n        \"gl_FragColor = texture2D(state, uv);\",\n    \"}\"\n].join( \"\\n\" );\n\n//Computes the color of a single pixel\nvar renderStateFS = [\n    commonFS,\n\n    \"void main( void ) {\",\n        \"gl_FragColor = vec4(texture2D(state, uv).xyz, 1);\",\n    \"}\"\n\n].join( \"\\n\" );\n\n\n//Creates a shader\nfunction makeShader(frag_src, buf_num) { \n    return new GLOW.Shader({\n        vertexShader: passThruVS,\n        fragmentShader: frag_src,\n        data: {\n            state: buffers[buf_num],\n            vertices: GLOW.Geometry.Plane.vertices(),\n            uvs: GLOW.Geometry.Plane.uvs()\n        },\n        indices: GLOW.Geometry.Plane.indices(),\n        primitives: GLOW.Geometry.Plane.primitives()\n    });\n};\n\n\n//Create processes\nvar updatePass = new Array(buffers.length);\nvar renderPass = new Array(buffers.length);\n\n//This is stupid, but I can't figure out how to get GLOW to swap a buffer -Mik\n(function() {\n    for(var i=0; i<buffers.length; ++i) {\n        updatePass[i] = makeShader(updateStateFS, (i - 1 + buffers.length) % buffers.length);\n        renderPass[i] = makeShader(renderStateFS, i);\n    }\n})();\n\n\n// Render (using setInterval as WebGL Inspector have problem with requestAnimationFrame)\nvar nextFrame = (function(){\n      return  window.requestAnimationFrame       || \n              window.webkitRequestAnimationFrame || \n              window.mozRequestAnimationFrame    || \n              window.oRequestAnimationFrame      || \n              window.msRequestAnimationFrame     || \n              function( callback ){\n                window.setTimeout(callback, 1000 / 60);\n              };\n    })();\n\n\n//Render a frame\nfunction render() {\n    //Initialize context\n    context.cache.clear();\n    context.enableDepthTest(false);\n    \n    for(var i=0; i<parameters.STEPS_PER_FRAME; ++i) {\n        //Increment buffer number\n        current_buffer = (current_buffer + 1) % buffers.length;\n        \n        //Compute next state\n        buffers[current_buffer].bind();\n        updatePass[current_buffer].draw();\n        buffers[current_buffer].unbind();\n    }\n    \n    //Render state of system to canvas\n    renderPass[current_buffer].draw();\n    \n    nextFrame(render);\n}\n\nrender();\n​\n"
  },
  {
    "path": "Resources/lib/GLOW.js",
    "content": "// GLOW.js r1.1 - http://github.com/empaempa/GLOW\nvar GLOW=function(){function b(a,c,b){this.flags=a;this.callback=c;this.context=b}var a={},c={},f=-1,e=[];b.prototype.dispatch=function(a,c){this.flags===a&&(this.context?this.callback.call(this.context,c):this.callback(c))};a.LOGS=1;a.WARNINGS=2;a.ERRORS=4;a.logFlags=a.ERRORS;a.currentContext={};a.registerContext=function(b){c[b.id]=b;a.enableContext(b)};a.getContextById=function(b){if(c[b])return c[b];GLOW.error(\"Couldn't find context id \"+b+\", returning current with id \"+a.currentContext.id);return a.currentContext};\na.enableContext=function(c){a.currentContext=typeof c===\"string\"?getContextById(c):c;GL=a.GL=a.currentContext.GL};a.uniqueId=function(){return++f};a.log=function(c){a.logFlags&a.LOGS&&console.log(c);a.dispatch(a.LOGS,c)};a.warn=function(c){a.logFlags&a.WARNINGS&&console.warn(c);a.dispatch(a.WARNINGS,c)};a.error=function(c){a.logFlags&a.ERRORS&&console.error(c);a.dispatch(a.ERRORS,c)};a.addEventListener=function(a,c,f){e.push(new b(a,c,f));return e[e.length-1]};a.removeEventListener=function(c){c=\ne.indexOf(c);c!==-1?e.splice(c,1):a.warn(\"GLOW.removeEventListener: Couldn't find listener object\")};a.dispatch=function(a,c){for(var b=e.length;b--;)e[b].dispatch(a,c)};return a}(),GL={};\nGLOW.Context=function(){function b(a){a===void 0&&(a={});this.id=a.id!==void 0?a.id:GLOW.uniqueId();this.alpha=a.alpha!==void 0?a.alpha:!0;this.depth=a.depth!==void 0?a.depth:!0;this.antialias=a.antialias!==void 0?a.antialias:!0;this.stencil=a.stencil!==void 0?a.stencil:!1;this.premultipliedAlpha=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:!0;this.preserveDrawingBuffer=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:!1;this.width=a.width!==void 0?a.width:window.innerWidth;this.height=\na.height!==void 0?a.height:window.innerHeight;this.cache=new GLOW.Cache;this.debug=a.debug!==void 0?a.debug:!1;if(a.context)this.GL=a.context,GLOW.registerContext(this);else{try{this.domElement=document.createElement(\"canvas\");if(this.debug&&window.WebGLDebugUtils)this.domElement=WebGLDebugUtils.makeLostContextSimulatingCanvas(this.domElement);this.GL=this.domElement.getContext(\"experimental-webgl\",{alpha:this.alpha,depth:this.depth,antialias:this.antialias,stencil:this.stencil,premultipliedAlpha:this.premultipliedAlpha,\npreserveDrawingBuffer:this.preserveDrawingBuffer})}catch(c){GLOW.error(\"GLOW.Context.construct: \"+c)}if(this.GL!==null){GLOW.registerContext(this);this.domElement.width=this.width;this.domElement.height=this.height;this.viewport=a.viewport?{x:a.viewport.x!==void 0?a.viewport.x:0,y:a.viewport.y!==void 0?a.viewport.y:0,width:a.viewport.width!==void 0?a.viewport.width:this.width,height:a.viewport.height!==void 0?a.viewport.height:this.height}:{x:0,y:0,width:this.width,height:this.height};if(a.clear){if(this.clearSettings=\n{r:a.clear.red!==void 0?a.clear.red:0,g:a.clear.green!==void 0?a.clear.green:0,b:a.clear.blue!==void 0?a.clear.blue:0,a:a.clear.alpha!==void 0?a.clear.alpha:1,depth:a.clear.depth!==void 0?a.clear.depth:1,bits:a.clear.bits!==void 0?a.clear.bits:-1},this.clearSettings.bits===-1)this.clearSettings.bits=GL.COLOR_BUFFER_BIT,this.clearSettings.bits|=this.depth?GL.DEPTH_BUFFER_BIT:0,this.clearSettings.bits|=this.stencil?GL.STENCIL_BUFFER_BIT:0}else this.clearSettings={r:0,g:0,b:0,a:1,depth:1,bits:0},this.clearSettings.bits=\nGL.COLOR_BUFFER_BIT,this.clearSettings.bits|=this.depth?GL.DEPTH_BUFFER_BIT:0,this.clearSettings.bits|=this.stencil?GL.STENCIL_BUFFER_BIT:0;this.enableCulling(!0,{frontFace:GL.CCW,cullFace:GL.BACK});this.enableDepthTest(!0,{func:GL.LEQUAL,write:!0,zNear:0,zFar:1});this.enableBlend(!1);this.setViewport();this.clear()}else GLOW.error(\"GLOW.Context.construct: unable to initialize WebGL\")}}b.prototype.setupClear=function(a){if(a!==void 0)this.clearSettings.r=a.red!==void 0?Math.min(1,Math.max(0,a.red)):\nthis.clearSettings.r,this.clearSettings.g=a.green!==void 0?Math.min(1,Math.max(0,a.green)):this.clearSettings.g,this.clearSettings.b=a.blue!==void 0?Math.min(1,Math.max(0,a.blue)):this.clearSettings.b,this.clearSettings.a=a.alpha!==void 0?Math.min(1,Math.max(0,a.alpha)):this.clearSettings.a,this.clearSettings.depth=a.depth!==void 0?Math.min(1,Math.max(0,a.depth)):this.clearSettings.depth,this.clearSettings.bits=a.bits!==void 0?a.bits:this.clearSettings.bits;GL.clearColor(this.clearSettings.r,this.clearSettings.g,\nthis.clearSettings.b,this.clearSettings.a);GL.clearDepth(this.clearSettings.depth);return this};b.prototype.clear=function(a){this.setupClear(a);GL.clear(this.clearSettings.bits);return this};b.prototype.enableBlend=function(a,c){a?(GL.enable(GL.BLEND),c&&this.setupBlend(c)):GL.disable(GL.BLEND);return this};b.prototype.setupBlend=function(a){a.equationRGB?(a.equationAlpha&&GL.blendEquationSeparate(a.equationRGB,a.equationAlpha),a.srcRGB&&GL.blendFuncSeparate(a.srcRGB,a.dstRGB,a.srcAlpha,a.dstAlpha)):\n(a.equation&&GL.blendEquation(a.equation),a.src&&GL.blendFunc(a.src,a.dst));return this};b.prototype.enableDepthTest=function(a,c){a?(GL.enable(GL.DEPTH_TEST),c&&this.setupDepthTest(c)):GL.disable(GL.DEPTH_TEST);return this};b.prototype.setupDepthTest=function(a){a.func!==void 0&&GL.depthFunc(a.func);a.write!==void 0&&GL.depthMask(a.write);a.zNear!==void 0&&a.zFar!==void 0&&a.zNear<=a.zFar&&GL.depthRange(Math.max(0,Math.min(1,a.zNear)),Math.max(0,Math.min(1,a.zFar)));return this};b.prototype.enablePolygonOffset=\nfunction(a,c){a?(GL.enable(GL.POLYGON_OFFSET_FILL),c&&this.setupPolygonOffset(c)):GL.disable(GL.POLYGON_OFFSET_FILL);return this};b.prototype.setupPolygonOffset=function(a){a.factor&&a.units&&GL.polygonOffset(a.factor,a.units)};b.prototype.enableStencilTest=function(a,c){a?(GL.enable(GL.STENCIL_TEST),c&&this.setupStencilTest(c)):GL.disable(GL.STENCIL_TEST);return this};b.prototype.setupStencilTest=function(a){a.func&&a.funcFace?GL.stencilFuncSeparate(a.funcFace,a.func,a.funcRef,a.funcMask):a.func&&\nGL.stencilFunc(a.func,a.funcRef,a.funcMask);a.mask&&a.maskFace?GL.stencilMaskSeparate(a.maskFace,a.mask):a.mask&&GL.stencilMask(a.mask);a.opFail&&a.opFace?GL.stencilOpSeparate(a.opFace,a.opFail,a.opZfail,a.opZpass):a.opFail&&GL.stencilOp(a.opFail,a.opZfail,a.opZpass);return this};b.prototype.enableCulling=function(a,c){a?(GL.enable(GL.CULL_FACE),c&&this.setupCulling(c)):GL.disable(GL.CULL_FACE);return this};b.prototype.setupCulling=function(a){try{a.frontFace&&GL.frontFace(a.frontFace),a.cullFace&&\nGL.cullFace(a.cullFace)}catch(c){GLOW.error(\"GLOW.Context.setupCulling: \"+c)}return this};b.prototype.enableScissor=function(a,c){a?(GL.enable(GL.SCISSOR_TEST),c&&this.setupScissor(c)):GL.disable(GL.SCISSOR_TEST);return this};b.prototype.setupScissor=function(a){try{GL.scissor(a.x,a.y,a.width,a.height)}catch(c){GLOW.error(\"GLOW.Context.setupScissorTest: \"+c)}return this};b.prototype.setViewport=function(){this.setupViewport()};b.prototype.setupViewport=function(a){if(a)this.viewport.x=a.x!==void 0?\na.x:this.viewport.x,this.viewport.y=a.y!==void 0?a.y:this.viewport.y,this.viewport.width=a.width!==void 0?a.width:this.viewport.width,this.viewport.height=a.height!==void 0?a.height:this.viewport.height;GL.viewport(this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height);return this};b.prototype.availableExtensions=function(){return GL.getSupportedExtensions()};b.prototype.enableExtension=function(a){for(var c=GL.getSupportedExtensions(),b=0,e=c.length;b<e;b++)if(a.toLowerCase()===\nc[b].toLowerCase())break;if(b!==e)return GL.getExtension(c[b])};b.prototype.getParameter=function(a){return GL.getParameter(a)};b.prototype.maxVertexTextureImageUnits=function(){return this.getParameter(GL.MAX_VERTEX_TEXTURE_IMAGE_UNITS)};b.prototype.resize=function(a,c){var b=c/this.height;this.viewport.width*=a/this.width;this.viewport.height*=b;this.domElement.width=this.width=a;this.domElement.height=this.height=c};return b}();\nGLOW.Compiler=function(){var b={};b.compile=function(a){var c=GLOW.currentContext.cache.codeCompiled(a.vertexShader,a.fragmentShader);c===void 0&&(c=b.linkProgram(b.compileVertexShader(a.vertexShader),b.compileFragmentShader(a.fragmentShader)),GLOW.currentContext.cache.addCompiledProgram(c));var f=b.createUniforms(b.extractUniforms(c),a.data),e=b.createAttributes(b.extractAttributes(c),a.data,a.usage,a.interleave),g=b.interleaveAttributes(e,a.interleave);if(a.elements)GLOW.error(\"GLOW.Compiler.compile: .elements is no longer supported, please use .indices combined with .primitives\");\nelse{var h=a.indices,i=a.primitives!==void 0?a.primitives:GL.TRIANGLES,j=a.usage!==void 0?a.usage:{},k=j.primitives;if(a.triangles)h=a.triangles,k=j.triangles;else if(a.triangleStrip)h=a.triangleStrip,i=GL.TRIANGLE_STRIP,k=j.triangleStrip;else if(a.triangleFan)h=a.triangleFan,i=GL.TRIANGLE_FAN,k=j.triangleFan;else if(a.points)h=a.points,i=GL.POINTS,k=j.points;else if(a.lines)h=a.lines,i=GL.LINES,k=j.lines;else if(a.lineLoop)h=a.lineLoop,i=GL.LINE_LOOP,k=j.lineLoop;else if(a.lineStrip)h=a.lineStrip,\ni=GL.LINE_STRIP,k=j.lineStrip;if(h===void 0){for(var l in e)if(e[l].data){h=e[l].data.length/e[l].size;break}if(h===void 0)for(var m in g){for(l in g[m].attributes){h=g[m].attributes[l].data.length/g[m].attributes[l].size;break}break}h===void 0&&(h=0)}h=b.createElements(h,i,k);return new GLOW.CompiledData(c,f,e,g,h,a)}};b.compileVertexShader=function(a){var c;c=GL.createShader(GL.VERTEX_SHADER);c.id=GLOW.uniqueId();GL.shaderSource(c,a);GL.compileShader(c);!GL.getShaderParameter(c,GL.COMPILE_STATUS)&&\n!GL.isContextLost()&&GLOW.error(\"GLOW.Compiler.compileVertexShader: \"+GL.getShaderInfoLog(c));return c};b.compileFragmentShader=function(a){var c;c=GL.createShader(GL.FRAGMENT_SHADER);c.id=GLOW.uniqueId();GL.shaderSource(c,a);GL.compileShader(c);!GL.getShaderParameter(c,GL.COMPILE_STATUS)&&!GL.isContextLost()&&GLOW.error(\"GLOW.Compiler.compileFragmentShader: \"+GL.getShaderInfoLog(c));return c};b.linkProgram=function(a,c){var b=GL.createProgram();b||GLOW.error(\"GLOW.Compiler.linkProgram: Could not create program\");\nb.id=GLOW.uniqueId();GL.attachShader(b,a);GL.attachShader(b,c);GL.linkProgram(b);!GL.getProgramParameter(b,GL.LINK_STATUS)&&!GL.isContextLost()&&GLOW.error(\"GLOW.Compiler.linkProgram: Could not initialise program\");return b};b.extractUniforms=function(a){for(var c={},b,e=0,g=GL.getProgramParameter(a,GL.ACTIVE_UNIFORMS);e<g;e++)if(b=GL.getActiveUniform(a,e),b!==null&&b!==-1&&b!==void 0)b={name:b.name.split(\"[\")[0],size:b.size,type:b.type,location:GL.getUniformLocation(a,b.name.split(\"[\")[0]),locationNumber:e},\nc[b.name]=b;else break;return c};b.extractAttributes=function(a){for(var c={},b,e=0,g=GL.getProgramParameter(a,GL.ACTIVE_ATTRIBUTES);e<g;e++)if(b=GL.getActiveAttrib(a,e),b!==null&&b!==-1&&b!==void 0)b={name:b.name,size:b.size,type:b.type,location:GL.getAttribLocation(a,b.name),locationNumber:e},c[b.name]=b;else break;a.highestAttributeNumber=e-1;return c};b.createUniforms=function(a,c){var b,e={},g,h,i=0;for(b in a)if(g=a[b],h=g.name,c[h]instanceof GLOW.Uniform)e[h]=c[h];else if(c[h]===void 0&&GLOW.warn(\"GLOW.Compiler.createUniforms: missing data for uniform \"+\nh+\". Creating anyway, but make sure to set data before drawing.\"),e[h]=new GLOW.Uniform(g,c[h]),e[h].type===GL.SAMPLER_2D||e[h].type===GL.SAMPLER_CUBE)e[h].textureUnit=i++,e[h].data!==void 0&&e[h].data.init();return e};b.createAttributes=function(a,c,b,e){var g,h,i,j={},e=e!==void 0?e:{},b=b!==void 0?b:{};for(g in a)h=a[g],i=h.name,c[i]instanceof GLOW.Attribute?j[i]=c[i]:(c[i]===void 0&&GLOW.warn(\"GLOW.Compiler.createAttributes: missing data for attribute \"+i+\". Creating anyway, but make sure to set data before drawing.\"),\nj[i]=new GLOW.Attribute(h,c[i],b[i],e[i]!==void 0?e[i]:!0));return j};b.interleaveAttributes=function(a,c){var c=c!==void 0?c:{},b,e,g,h,i;g=0;var j=[];e=0;for(b in a)e++;if(e===1)for(b in a){if(a[b].interleaved===!0)a[b].interleaved=!1,a[b].data&&a[b].bufferData()}else{for(b in a)c[b]!==void 0&&c[b]!==!1&&(g=Math.max(g-1,c[b])+1);for(b in a)c[b]===void 0&&(c[b]=g);for(i in c)c[i]!==!1&&(j[c[i]]===void 0&&(j[c[i]]=[]),j[c[i]].push(a[i]));var k,l;b=0;for(e=j.length;b<e;b++)if(j[b]!==void 0){g=k=0;\nfor(h=j[b].length;g<h;g++)if(k+j[b][g].size*4>255){GLOW.warn(\"GLOW.Compiler.interleaveAttributes: Stride owerflow, moving attributes to new interleave index. Please check your interleave setup!\");l=j.length;for(j[l]=[];g<h;)j[l].push(j[b][g]),j[b].splice(g,1),h--}else k+=j[b][g].size*4}l={};b=0;for(e=j.length;b<e;b++)if(j[b]!==void 0){k=\"\";g=0;for(h=j[b].length;g<h;g++)k+=g!==h-1?j[b][g].name+\"_\":j[b][g].name;l[k]=new GLOW.InterleavedAttributes(j[b])}for(i in c)c[i]!==!1&&delete a[i];return l}};b.createElements=\nfunction(a,c,b){return a instanceof GLOW.Elements?a:new GLOW.Elements(a,c,b)};return b}();\nGLOW.CompiledData=function(){function b(a,c,b,e,g){this.program=a;this.uniforms=c||{};this.attributes=b||{};this.interleavedAttributes=e||{};this.elements=g;this.interleavedAttributeArray=this.attributeArray=this.uniformArray=void 0;this.createArrays()}b.prototype.createArrays=function(){this.uniformArray=[];this.attributeArray=[];this.interleavedAttributeArray=[];var a,c,b;for(a in this.uniforms)this.uniformArray.push(this.uniforms[a]);for(c in this.attributes)this.attributeArray.push(this.attributes[c]);\nfor(b in this.interleavedAttributes)this.interleavedAttributeArray.push(this.interleavedAttributes[b])};b.prototype.clone=function(a){var c=new GLOW.CompiledData,a=a||{},b;for(b in this.uniforms)if(a[b])if(a[b]instanceof GLOW.Uniform)c.uniforms[b]=execept[b];else{if(c.uniforms[b]=new GLOW.Uniform(this.uniforms[b],a[b]),c.uniforms[b].type===GL.SAMPLER_2D||c.uniforms[b].type===GL.SAMPLER_CUBE)c.uniforms[b].textureUnit=this.uniforms[b].textureUnit,c.uniforms[b].data&&c.uniforms[b].data.init()}else c.uniforms[b]=\nthis.uniforms[b];for(var e in this.attributes)c.attributes[e]=a[e]?a[e]instanceof GLOW.Attribute?a[e]:new GLOW.Attribute(this.attributes[e],a[e]):this.attributes[e];for(var g in this.interleavedAttributes)c.interleavedAttributes[g]=a[g]?a[g]:this.interleavedAttributes[g];c.elements=a.indices?new GLOW.Elements(a.indices,a.primitives):a.elements instanceof GLOW.Elements?a.elements:this.elements;c.program=a.program?a.program:this.program;c.createArrays();return c};b.prototype.dispose=function(a,c){if(a){var b;\nfor(b=this.uniformArray.length;b--;)this.uniformArray[b].dispose();for(b=this.attributeArray.length;b--;)this.attributeArray[b].dispose();for(b=this.interleavedAttributeArray.length;b--;)this.interleavedAttributeArray[b].dispose();this.elements.dispose()}if(c&&GL.isProgram(this.program)&&(b=GL.getAttachedShaders(this.program))){for(var e=b.length;e--;)GL.detachShader(this.program,b[e]),GL.deleteShader(b[e]);GL.deleteProgram(this.program)}delete this.program;delete this.uniforms;delete this.attributes;\ndelete this.interleavedAttributes;delete this.elements;delete this.uniformArray;delete this.attributeArray;delete this.interleavedAttributeArray};return b}();\nGLOW.Cache=function(){function b(){this.highestAttributeNumber=-1;this.uniformByLocation=[];this.attributeByLocation=[];this.textureByLocation=[];this.compiledCode=[];this.programId=this.elementId=-1;this.active=!0}b.prototype.codeCompiled=function(a,c){var b,e,g=this.compiledCode.length;for(e=0;e<g;e++)if(b=this.compiledCode[e],a===b.vertexShader&&c===b.fragmentShader)break;if(e===g)this.compiledCode.push({vertexShader:a,fragmentShader:c});else return this.compiledCode[e].program};b.prototype.addCompiledProgram=\nfunction(a){this.compiledCode[this.compiledCode.length-1].program=a};b.prototype.programCached=function(a){if(this.active){if(a.id===this.programId)return!0;this.programId=a.id;this.uniformByLocation.length=0;this.attributeByLocation.length=0;this.textureByLocation.length=0;this.elementId=-1}return!1};b.prototype.setProgramHighestAttributeNumber=function(a){var c=this.highestAttributeNumber;this.highestAttributeNumber=a.highestAttributeNumber;return a.highestAttributeNumber-c};b.prototype.uniformCached=\nfunction(a){if(this.active){if(this.uniformByLocation[a.locationNumber]===a.id)return!0;this.uniformByLocation[a.locationNumber]=a.id}return!1};b.prototype.invalidateUniform=function(a){this.uniformByLocation[a.locationNumber]=void 0};b.prototype.attributeCached=function(a){if(this.active){if(this.attributeByLocation[a.locationNumber]===a.id)return!0;this.attributeByLocation[a.locationNumber]=a.id}return!1};b.prototype.interleavedAttributeCached=function(a){if(this.active)for(var c=0,b=a.attributes.length,\ne;c<b;c++){e=a.attributes[c];if(this.attributeByLocation[e.locationNumber]===e.id)return!0;this.attributeByLocation[e.locationNumber]=e.id}return!1};b.prototype.invalidateAttribute=function(a){this.attributeByLocation[a.locationNumber]=void 0};b.prototype.textureCached=function(a,c){if(this.active){if(this.textureByLocation[a]===c.id)return!0;this.textureByLocation[a]=c.id}return!1};b.prototype.invalidateTexture=function(a){this.textureByLocation[a]=void 0};b.prototype.elementsCached=function(a){if(this.active){if(a.id===\nthis.elementId)return!0;this.elementId=a.id}return!1};b.prototype.invalidateElements=function(){this.elementId=-1};b.prototype.clear=function(){this.highestAttributeNumber=-1;this.uniformByLocation.length=0;this.attributeByLocation.length=0;this.textureByLocation.length=0;this.programId=this.elementId=-1};return b}();\nGLOW.FBO=function(){function b(a){a=a!==void 0?a:{};this.id=GLOW.uniqueId();this.width=a.width||a.size||window.innerWidth;this.height=a.height||a.size||window.innerHeight;this.wrapS=a.wrapS||a.wrap||GL.CLAMP_TO_EDGE;this.wrapT=a.wrapT||a.wrap||GL.CLAMP_TO_EDGE;this.magFilter=a.magFilter||a.filter||GL.LINEAR;this.minFilter=a.minFilter||a.filter||GL.LINEAR;this.internalFormat=a.internalFormat||GL.RGBA;this.format=a.format||GL.RGBA;this.type=a.type||GL.UNSIGNED_BYTE;this.depth=a.depth!==void 0?a.depth:\n!0;this.stencil=a.stencil!==void 0?a.stencil:!1;this.data=a.data||null;this.isBound=!1;this.textureUnit=-1;this.textureType=a.cube!==!0?GL.TEXTURE_2D:GL.TEXTURE_CUBE_MAP;this.viewport=a.viewport?{x:a.viewport.x!==void 0?a.viewport.x:0,y:a.viewport.y!==void 0?a.viewport.y:0,width:a.viewport.width!==void 0?a.viewport.width:this.width,height:a.viewport.height!==void 0?a.viewport.height:this.height}:{x:0,y:0,width:this.width,height:this.height};if(a.clear){if(this.clearSettings={r:a.clear.red!==void 0?\na.clear.red:0,g:a.clear.green!==void 0?a.clear.green:0,b:a.clear.blue!==void 0?a.clear.blue:0,a:a.clear.alpha!==void 0?a.clear.alpha:1,depth:a.clear.depth!==void 0?a.clear.depth:1,bits:a.clear.bits!==void 0?a.clear.bits:-1},this.clearSettings.bits===-1)this.clearSettings.bits=GL.COLOR_BUFFER_BIT,this.clearSettings.bits|=this.depth?GL.DEPTH_BUFFER_BIT:0,this.clearSettings.bits|=this.stencil?GL.STENCIL_BUFFER_BIT:0}else this.clearSettings={r:0,g:0,b:0,a:1,depth:1,bits:0},this.clearSettings.bits=GL.COLOR_BUFFER_BIT,\nthis.clearSettings.bits|=this.depth?GL.DEPTH_BUFFER_BIT:0,this.clearSettings.bits|=this.stencil?GL.STENCIL_BUFFER_BIT:0;this.createBuffers()}var a={posX:0,negX:1,posY:2,negY:3,posZ:4,negZ:5};b.prototype.createBuffers=function(){this.texture=GL.createTexture();var c=GL.getError();if(c!==GL.NO_ERROR&&c!==GL.CONTEXT_LOST_WEBGL)GLOW.error(\"GLOW.FBO.createBuffers: Error creating render texture.\");else{GL.bindTexture(this.textureType,this.texture);GL.texParameteri(this.textureType,GL.TEXTURE_WRAP_S,this.wrapS);\nGL.texParameteri(this.textureType,GL.TEXTURE_WRAP_T,this.wrapT);GL.texParameteri(this.textureType,GL.TEXTURE_MAG_FILTER,this.magFilter);GL.texParameteri(this.textureType,GL.TEXTURE_MIN_FILTER,this.minFilter);if(this.textureType===GL.TEXTURE_2D)this.data===null||this.data instanceof Uint8Array||this.data instanceof Float32Array?GL.texImage2D(this.textureType,0,this.internalFormat,this.width,this.height,0,this.format,this.type,this.data):GL.texImage2D(this.textureType,0,this.internalFormat,this.format,\nthis.type,this.data);else for(var b in a)GL.texImage2D(GL.TEXTURE_CUBE_MAP_POSITIVE_X+a[b],0,this.internalFormat,this.width,this.height,0,this.format,this.type,this.data[b]);if(this.depth||this.stencil){this.renderBuffer=GL.createRenderbuffer();c=GL.getError();if(c!==GL.NO_ERROR&&c!==GL.CONTEXT_LOST_WEBGL){GLOW.error(\"GLOW.FBO.createBuffers: Error creating render buffer.\");return}GL.bindRenderbuffer(GL.RENDERBUFFER,this.renderBuffer);this.depth&&!this.stencil?GL.renderbufferStorage(GL.RENDERBUFFER,\nGL.DEPTH_COMPONENT16,this.width,this.height):!this.depth&&this.stencil?GL.renderbufferStorage(GL.RENDERBUFFER,GL.STENCIL_INDEX8,this.width,this.height):this.depth&&this.stencil&&GL.renderbufferStorage(GL.RENDERBUFFER,GL.DEPTH_STENCIL,this.width,this.height)}if(this.textureType===GL.TEXTURE_2D){this.frameBuffer=GL.createFramebuffer();c=GL.getError();if(c!==GL.NO_ERROR&&c!==GL.CONTEXT_LOST_WEBGL){GLOW.error(\"GLOW.FBO.createBuffers: Error creating frame buffer.\");return}GL.bindFramebuffer(GL.FRAMEBUFFER,\nthis.frameBuffer);GL.framebufferTexture2D(GL.FRAMEBUFFER,GL.COLOR_ATTACHMENT0,GL.TEXTURE_2D,this.texture,0);this.depth&&!this.stencil?GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.DEPTH_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer):!this.depth&&this.stencil?GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.STENCIL_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer):this.depth&&this.stencil&&GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.DEPTH_STENCIL_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer)}else{this.frameBuffers=\n{};for(var e in a){this.frameBuffers[e]=GL.createFramebuffer();c=GL.getError();if(c!==GL.NO_ERROR&&c!==GL.CONTEXT_LOST_WEBGL){GLOW.error(\"GLOW.FBO.createBuffers: Error creating frame buffer for side \"+e);return}GL.bindFramebuffer(GL.FRAMEBUFFER,this.frameBuffers[e]);GL.framebufferTexture2D(GL.FRAMEBUFFER,GL.COLOR_ATTACHMENT0,GL.TEXTURE_CUBE_MAP_POSITIVE_X+a[e],this.texture,0);this.depth&&!this.stencil?GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.DEPTH_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer):\n!this.depth&&this.stencil?GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.STENCIL_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer):this.depth&&this.stencil&&GL.framebufferRenderbuffer(GL.FRAMEBUFFER,GL.DEPTH_STENCIL_ATTACHMENT,GL.RENDERBUFFER,this.renderBuffer)}}GL.bindTexture(this.textureType,null);GL.bindRenderbuffer(GL.RENDERBUFFER,null);GL.bindFramebuffer(GL.FRAMEBUFFER,null)}};b.prototype.deleteBuffers=function(){this.texture&&GL.deleteTexture(this.texture);this.renderBuffer&&GL.deleteRenderbuffer(this.renderBuffer);\nif(this.textureType===GL.TEXTURE_2D)this.frameBuffer&&GL.deleteFramebuffer(this.frameBuffer);else for(var c in a)GL.deleteFramebuffer(this.frameBuffers[c])};b.prototype.init=function(){};b.prototype.bind=function(a,b){if(!this.isBound)this.isBound=!0,(a||a===void 0)&&this.setupViewport(a),this.textureType===GL.TEXTURE_2D?GL.bindFramebuffer(GL.FRAMEBUFFER,this.frameBuffer):GL.bindFramebuffer(GL.FRAMEBUFFER,this.frameBuffers[b!==void 0?b:\"posX\"]);return this};b.prototype.unbind=function(a){if(this.isBound)this.isBound=\n!1,GL.bindFramebuffer(GL.FRAMEBUFFER,null),(a===void 0||a===!0)&&GL.viewport(GLOW.currentContext.viewport.x,GLOW.currentContext.viewport.y,GLOW.currentContext.viewport.width,GLOW.currentContext.viewport.height);return this};b.prototype.setViewport=function(){this.setupViewport()};b.prototype.setupViewport=function(a){if(a)this.viewport.x=a.x!==void 0?a.x:this.viewport.x,this.viewport.y=a.y!==void 0?a.y:this.viewport.y,this.viewport.width=a.width!==void 0?a.width:this.viewport.width,this.viewport.height=\na.height!==void 0?a.height:this.viewport.height;GL.viewport(this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height);return this};b.prototype.setupClear=function(a){if(a!==void 0)this.clearSettings.r=a.red!==void 0?Math.min(1,Math.max(0,a.red)):this.clearSettings.r,this.clearSettings.g=a.green!==void 0?Math.min(1,Math.max(0,a.green)):this.clearSettings.g,this.clearSettings.b=a.blue!==void 0?Math.min(1,Math.max(0,a.blue)):this.clearSettings.b,this.clearSettings.a=a.alpha!==void 0?\nMath.min(1,Math.max(0,a.alpha)):this.clearSettings.a,this.clearSettings.depth=a.depth!==void 0?Math.min(1,Math.max(0,a.depth)):this.clearSettings.depth,this.clearSettings.bits=a.bits!==void 0?a.bits:this.clearSettings.bits;GL.clearColor(this.clearSettings.r,this.clearSettings.g,this.clearSettings.b,this.clearSettings.a);GL.clearDepth(this.clearSettings.depth);return this};b.prototype.clear=function(a){this.isBound&&(this.setupClear(a),GL.clear(this.clearSettings.bits));return this};b.prototype.resize=\nfunction(a,b){var e=b/this.height;this.viewport.width*=a/this.width;this.viewport.height*=e;this.width=a;this.height=b;this.deleteBuffers();this.createBuffers();return this};b.prototype.generateMipMaps=function(){GL.bindTexture(this.textureType,this.texture);GL.generateMipmap(this.textureType);GL.bindTexture(this.textureType,null);return this};b.prototype.dispose=function(){this.deleteBuffers();delete this.data;delete this.viewport;delete this.texture;delete this.renderBuffer;delete this.frameBuffer;\ndelete this.frameBuffers;delete this.viewport;delete this.clearSettings};return b}();\nGLOW.Texture=function(){function b(a){if(a.url!==void 0)a.data=a.url;this.id=GLOW.uniqueId();this.data=a.data;this.autoUpdate=a.autoUpdate;this.internalFormat=a.internalFormat||GL.RGBA;this.format=a.format||GL.RGBA;this.type=a.type||GL.UNSIGNED_BYTE;this.wrapS=a.wrapS||a.wrap||GL.REPEAT;this.wrapT=a.wrapT||a.wrap||GL.REPEAT;this.magFilter=a.magFilter||a.filter||GL.LINEAR;this.minFilter=a.minFilter||a.filter||GL.LINEAR_MIPMAP_LINEAR;this.width=a.width;this.height=a.height;this.onLoadComplete=a.onLoadComplete;\nthis.onLoadContext=a.onLoadContext;this.texture=void 0}var a={posX:0,negX:1,posY:2,negY:3,posZ:4,negZ:5};b.prototype.init=function(){if(this.texture!==void 0)return this;if(this.data===void 0&&this.width!==void 0&&this.height!==void 0)this.data=this.type===GL.UNSIGNED_BYTE?new Uint8Array(this.width*this.height*(this.format===GL.RGBA?4:3)):new Float32Array(this.width*this.height*(this.format===GL.RGBA?4:3));else if(typeof this.data===\"string\"){this.textureType=GL.TEXTURE_2D;var b=this.data,f=b.toLowerCase();\nif(f.indexOf(\".jpg\")!==-1||f.indexOf(\".png\")!==-1||f.indexOf(\".gif\")!==-1||f.indexOf(\"jpeg\")!==-1)this.data=new Image,this.data.scope=this,this.data.onload=this.onLoadImage;else{if(this.autoUpdate===void 0)this.autoUpdate=!0;this.data=document.createElement(\"video\");this.data.scope=this;this.data.addEventListener(\"loadeddata\",this.onLoadVideo,!1)}this.data.src=b}else if(this.data instanceof HTMLImageElement||this.data instanceof HTMLVideoElement||this.data instanceof HTMLCanvasElement||this.data instanceof\nUint8Array||this.data instanceof Float32Array)this.textureType=GL.TEXTURE_2D,this.createTexture();else{this.textureType=GL.TEXTURE_CUBE_MAP;this.itemsToLoad=0;for(var e in a)this.data[e]!==void 0?typeof this.data[e]===\"string\"&&this.itemsToLoad++:GLOW.error(\"GLOW.Texture.init: data type error. Did you forget cube map \"+e+\"? If not, the data type is not supported\");if(this.itemsToLoad===0)this.createTexture();else for(e in a)if(typeof this.data[e]===\"string\")b=this.data[e],f=b.toLowerCase(),f.indexOf(\".jpg\")!==\n-1||f.indexOf(\".png\")!==-1||f.indexOf(\".gif\")!==-1||f.indexOf(\"jpeg\")!==-1?(this.data[e]=new Image,this.data[e].scope=this,this.data[e].onload=this.onLoadCubeImage):(this.autoUpdate!==void 0?this.autoUpdate[e]=this.autoUpdate[e]!==void 0?this.autoUpdate[e]:!0:(this.autoUpdate={},this.autoUpdate[e]=!0),this.data[e]=document.createElement(\"video\"),this.data[e].scope=this,this.data[e].addEventListener(\"loadeddata\",this.onLoadCubeVideo,!1)),this.data[e].src=b}return this};b.prototype.createTexture=function(){this.texture!==\nvoid 0&&GL.deleteTexture(this.texture);this.texture=GL.createTexture();GL.bindTexture(this.textureType,this.texture);if(this.textureType===GL.TEXTURE_2D)if(this.data instanceof Uint8Array)if(this.width!==void 0&&this.height!==void 0)GL.texImage2D(this.textureType,0,this.internalFormat,this.width,this.height,0,this.format,this.type,this.data);else{GLOW.error(\"GLOW.Texture.createTexture: Textures of type Uint8Array requires width and height parameters. Quitting.\");return}else GL.texImage2D(this.textureType,\n0,this.internalFormat,this.format,this.type,this.data);else for(var b in a)if(this.data[b]instanceof Uint8Array||this.data[b]instanceof Float32Array)if(this.width!==void 0&&this.height!==void 0)GL.texImage2D(GL.TEXTURE_CUBE_MAP_POSITIVE_X+a[b],0,this.internalFormat,this.width,this.height,0,this.format,this.type,this.data[b]);else{GLOW.error(\"GLOW.Texture.createTexture: Textures of type Uint8Array/Float32Array requires width and height parameters. Quitting.\");return}else GL.texImage2D(GL.TEXTURE_CUBE_MAP_POSITIVE_X+\na[b],0,this.internalFormat,this.format,this.type,this.data[b]);GL.texParameteri(this.textureType,GL.TEXTURE_WRAP_S,this.wrapS);GL.texParameteri(this.textureType,GL.TEXTURE_WRAP_T,this.wrapT);GL.texParameteri(this.textureType,GL.TEXTURE_MIN_FILTER,this.minFilter);GL.texParameteri(this.textureType,GL.TEXTURE_MAG_FILTER,this.magFilter);this.minFilter!==GL.NEAREST&&this.minFilter!==GL.LINEAR&&GL.generateMipmap(this.textureType);return this};b.prototype.updateTexture=function(b){if(this.texture!==void 0){var b=\nb!==void 0?b:{},f=b.level||0,e=b.xOffset||0,g=b.yOffset||0,h=b.updateMipmap!==void 0?b.updateMipmap:!0;this.data=b.data||this.data;GL.bindTexture(this.textureType,this.texture);if(this.textureType==GL.TEXTURE_2D)this.data instanceof Uint8Array?GL.texSubImage2D(this.textureType,f,e,g,this.width,this.height,this.format,this.type,this.data):GL.texSubImage2D(this.textureType,f,e,g,this.format,this.type,this.data);else for(var i in b)a[i]!==void 0&&(this.data[i]instanceof Uint8Array?GL.texSubImage2D(GL.TEXTURE_CUBE_MAP_POSITIVE_X+\na[i],f,e,g,this.width,this.height,this.format,this.type,this.data[i]):GL.texSubImage2D(GL.TEXTURE_CUBE_MAP_POSITIVE_X+a[i],f,e,g,this.format,this.type,this.data[i]));this.minFilter!==GL.NEAREST&&this.minFilter!==GL.LINEAR&&h===!0&&GL.generateMipmap(this.textureType)}};b.prototype.swapTexture=function(a){this.dispose();this.data=a;this.init()};b.prototype.onLoadImage=function(){this.scope.createTexture();this.scope.onLoadComplete&&this.scope.onLoadComplete.call(this.scope.onLoadContext,this.scope)};\nb.prototype.onLoadCubeImage=function(){this.scope.itemsToLoad--;this.scope.itemsToLoad===0&&this.scope.createTexture()};b.prototype.onLoadVideo=function(){this.removeEventListener(\"loadeddata\",this.scope.onLoadVideo,!1);this.scope.createTexture()};b.prototype.onLoadCubeVideo=function(){this.removeEventListener(\"loadeddata\",this.scope.onLoadVideo,!1);this.scope.itemsToLoad--;this.scope.itemsToLoad===0&&this.scope.createTexture()};b.prototype.play=function(){if(this.textureType===GL.TEXTURE_2D)this.data instanceof\nHTMLVideoElement&&this.data.play();else for(var b in a)this.data[b]instanceof HTMLVideoElement&&this.data[b].play()};b.prototype.dispose=function(){if(this.texture!==void 0)GL.deleteTexture(this.texture),this.texture=void 0;this.data=void 0};return b}();\nGLOW.Shader=function(){function b(a){this.id=GLOW.uniqueId();this.compiledData=a.use?a.use.clone(a.except):GLOW.Compiler.compile(a);this.uniforms=this.compiledData.uniforms;this.elements=this.compiledData.elements;this.program=this.compiledData.program;this.attachData()}b.prototype.attachData=function(){var a,b,f;for(a in this.uniforms)this[a]===void 0?this.uniforms[a].data!==void 0?this[a]=this.uniforms[a].data:GLOW.warn(\"GLOW.Shader.attachUniformAndAttributeData: no data for uniform \"+a+\", not attaching for easy access. Please use Shader.uniforms.\"+\na+\".data to set data.\"):this[a]!==this.uniforms[a].data&&GLOW.warn(\"GLOW.Shader.attachUniformAndAttributeData: name collision on uniform \"+a+\", not attaching for easy access. Please use Shader.uniforms.\"+a+\".data to access data.\");for(b in this.compiledData.attributes){if(this.attributes===void 0)this.attributes=this.compiledData.attributes;this[b]===void 0?this[b]=this.compiledData.attributes[b]:this[b]!==this.compiledData.attributes[b]&&GLOW.warn(\"GLOW.Shader.attachUniformAndAttributeData: name collision on attribute \"+\nb+\", not attaching for easy access. Please use Shader.attributes.\"+b+\".data to access data.\")}for(f in this.compiledData.interleavedAttributes){if(this.interleavedAttributes===void 0)this.interleavedAttributes=this.compiledData.interleavedAttributes;this[f]===void 0?this[f]=this.compiledData.interleavedAttributes[f]:this[f]!==this.compiledData.interleavedAttributes[f]&&GLOW.warn(\"GLOW.Shader.attachUniformAndAttributeData: name collision on interleavedAttribute \"+b+\", not attaching for easy access. Please use Shader.interleavedAttributes.\"+\nb+\".data to access data.\")}};b.prototype.draw=function(){var a=this.compiledData,b=GLOW.currentContext.cache;if(!b.programCached(a.program)){GL.useProgram(a.program);var f=b.setProgramHighestAttributeNumber(a.program);if(f){var e=a.program.highestAttributeNumber,g=e-f+1;if(f>0)for(;g<=e;g++)GL.enableVertexAttribArray(g);else for(g--;g>e;g--)GL.disableVertexAttribArray(g)}}f=a.attributeArray;for(e=f.length;e--;)f[e].interleaved===!1&&(b.attributeCached(f[e])||f[e].bind());f=a.interleavedAttributeArray;\nfor(e=f.length;e--;)b.interleavedAttributeCached(f[e])||f[e].bind();f=a.uniformArray;for(e=f.length;e--;)b.uniformCached(f[e])||f[e].load();a.elements.draw()};b.prototype.clone=function(a){return new GLOW.Shader({use:this.compiledData,except:a})};b.prototype.dispose=function(a,b){var f,e,g;for(f in this.compiledData.uniforms)delete this[f];for(e in this.compiledData.attributes)delete this[e];for(g in this.compiledData.interleavedAttributes)delete this[g];delete this.program;delete this.elements;delete this.uniforms;\ndelete this.attributes;delete this.interleavedAttributes;this.compiledData.dispose(a,b);delete this.compiledData};return b}();\nGLOW.Elements=function(){function b(a,b,f,e){this.id=GLOW.uniqueId();this.type=b!==void 0?b:GL.TRIANGLES;this.offset=e!==void 0?e:0;typeof a===\"number\"||a===void 0?this.length=a:(a instanceof Uint16Array||(a=new Uint16Array(a)),this.length=a.length,this.elements=GL.createBuffer(),GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER,this.elements),GL.bufferData(GL.ELEMENT_ARRAY_BUFFER,a,f?f:GL.STATIC_DRAW))}b.prototype.draw=function(){this.elements!==void 0?(GLOW.currentContext.cache.elementsCached(this)||GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER,\nthis.elements),GL.drawElements(this.type,this.length,GL.UNSIGNED_SHORT,this.offset)):GL.drawArrays(this.type,this.offset,this.length)};b.prototype.clone=function(a){a=a||{};return new GLOW.Elements(a.data||this.data,a.type||this.type,a.usage,a.offset||this.offset)};b.prototype.dispose=function(){this.elements!==void 0&&(GL.deleteBuffer(this.elements),delete this.elements)};return b}();\nGLOW.Uniform=function(){function b(){f[GL.INT]=function(){GL.uniform1iv(this.location,this.getNativeValue())};f[GL.FLOAT]=function(){GL.uniform1fv(this.location,this.getNativeValue())};f[GL.INT_VEC2]=function(){GL.uniform2iv(this.location,this.getNativeValue())};f[GL.INT_VEC3]=function(){GL.uniform3iv(this.location,this.getNativeValue())};f[GL.INT_VEC4]=function(){GL.uniform4iv(this.location,this.getNativeValue())};f[GL.BOOL]=function(){GL.uniform1iv(this.location,this.getNativeValue())};f[GL.BOOL_VEC2]=\nfunction(){GL.uniform2iv(this.location,this.getNativeValue())};f[GL.BOOL_VEC3]=function(){GL.uniform3iv(this.location,this.getNativeValue())};f[GL.BOOL_VEC4]=function(){GL.uniform4iv(this.location,this.getNativeValue())};f[GL.FLOAT_VEC2]=function(){GL.uniform2fv(this.location,this.getNativeValue())};f[GL.FLOAT_VEC3]=function(){GL.uniform3fv(this.location,this.getNativeValue())};f[GL.FLOAT_VEC4]=function(){GL.uniform4fv(this.location,this.getNativeValue())};f[GL.FLOAT_MAT2]=function(){GL.uniformMatrix2fv(this.location,\n!1,this.getNativeValue())};f[GL.FLOAT_MAT3]=function(){GL.uniformMatrix3fv(this.location,!1,this.getNativeValue())};f[GL.FLOAT_MAT4]=function(){GL.uniformMatrix4fv(this.location,!1,this.getNativeValue())};f[GL.SAMPLER_2D]=function(){this.data.texture!==void 0&&this.textureUnit!==-1&&!GLOW.currentContext.cache.textureCached(this.textureUnit,this.data)&&(GL.uniform1i(this.location,this.textureUnit),GL.activeTexture(GL.TEXTURE0+this.textureUnit),GL.bindTexture(GL.TEXTURE_2D,this.data.texture),this.data.autoUpdate&&\nthis.data.updateTexture(this.data.autoUpdate))};f[GL.SAMPLER_CUBE]=function(){this.data.texture!==void 0&&this.textureUnit!==-1&&!GLOW.currentContext.cache.textureCached(this.textureUnit,this.data)&&(GL.uniform1i(this.location,this.textureUnit),GL.activeTexture(GL.TEXTURE0+this.textureUnit),GL.bindTexture(GL.TEXTURE_CUBE_MAP,this.data.texture),this.data.autoUpdate&&this.data.updateTexture(this.data.autoUpdate))}}function a(a,g){c||(c=!0,b());this.id=GLOW.uniqueId();this.data=g;this.name=a.name;this.length=\na.length;this.type=a.type;this.location=a.location;this.locationNumber=a.locationNumber;this.textureUnit=-1;this.load=a.loadFunction||f[this.type]}var c=!1,f=[];a.prototype.getNativeValue=function(){return this.data.value};a.prototype.clone=function(a){return new GLOW.Uniform(this,a||this.data)};a.prototype.dispose=function(){delete this.data;delete this.load;delete this.location};return a}();\nGLOW.Attribute=function(){function b(b,e,g,h){a||(a=!0,c[GL.INT]=1,c[GL.INT_VEC2]=2,c[GL.INT_VEC3]=3,c[GL.INT_VEC4]=4,c[GL.BOOL]=1,c[GL.BOOL_VEC2]=2,c[GL.BOOL_VEC3]=3,c[GL.BOOL_VEC4]=4,c[GL.FLOAT]=1,c[GL.FLOAT_VEC2]=2,c[GL.FLOAT_VEC3]=3,c[GL.FLOAT_VEC4]=4,c[GL.FLOAT_MAT2]=4,c[GL.FLOAT_MAT3]=9,c[GL.FLOAT_MAT4]=16);this.id=GLOW.uniqueId();this.data=e;this.location=b.location;this.locationNumber=b.locationNumber;this.offset=this.stride=0;this.usage=g!==void 0?g:GL.STATIC_DRAW;this.interleaved=h!==void 0?\nh:!1;this.size=c[b.type];this.name=b.name;this.type=b.type;this.data&&(this.data.length/this.size>65536&&GLOW.warn(\"GLOW.Attribute.constructor: Unreachable attribute? Please activate GL.drawArrays or split into multiple shaders. Indexed elements cannot reach attribute data beyond 65535.\"),this.interleaved===!1&&this.bufferData(this.data,this.usage))}var a=!1,c=[];b.prototype.setupInterleave=function(a,b){this.interleaved=!0;this.offset=a;this.stride=b};b.prototype.bufferData=function(a,b){if(a!==\nvoid 0&&this.data!==a)this.data=a;if(b!==void 0&&this.usage!==b)this.usage=b;if(this.buffer===void 0)this.buffer=GL.createBuffer();if(this.data.constructor.toString().indexOf(\" Array()\")!==-1)this.data=new Float32Array(this.data);GL.bindBuffer(GL.ARRAY_BUFFER,this.buffer);GL.bufferData(GL.ARRAY_BUFFER,this.data,this.usage)};b.prototype.bind=function(){this.interleaved===!1&&GL.bindBuffer(GL.ARRAY_BUFFER,this.buffer);GL.vertexAttribPointer(this.location,this.size,GL.FLOAT,!1,this.stride,this.offset)};\nb.prototype.clone=function(a){if(this.interleaved)GLOW.error(\"GLOW.Attribute.clone: Cannot clone interleaved attribute. Please check your interleave setup.\");else return a=a||{},new GLOW.Attribute(this,a.data||this.data,a.usage||this.usage,a.interleaved||this.interleaved)};b.prototype.dispose=function(){this.buffer&&(GL.deleteBuffer(this.buffer),delete this.buffer);delete this.data};return b}();\nGLOW.InterleavedAttributes=function(){function b(a){this.id=GLOW.uniqueId();this.attributes=a;var b,f=a[0].data.length/a[0].size,e,g=a.length,h,i,j,k=[],l,m=[];for(e=0;e<g;e++)k[e]=0;for(b=0;b<f;b++)for(e=0;e<g;e++){l=a[e].data;j=k[e];h=0;for(i=a[e].size;h<i;h++)m.push(l[j++]);k[e]=j}this.data=new Float32Array(m);this.usage=a[0].usage;for(e=0;e<g;e++)if(this.usage!==a[e].usage){GLOW.warn(\"GLOW.InterleavedAttributes.construct: Attribute \"+a[e].name+\" has different usage, defaulting to STATIC_DRAW.\");\nthis.usage=GL.STATIC_DRAW;break}this.bufferData(this.data,this.usage);for(e=b=0;e<g;e++)b+=a[e].size*4;for(e=f=0;e<g;e++)a[e].setupInterleave(f,b),f+=a[e].size*4}b.prototype.bufferData=function(a,b){if(a!==void 0&&this.data!==a)this.data=a;if(this.buffer===void 0)this.buffer=GL.createBuffer();GL.bindBuffer(GL.ARRAY_BUFFER,this.buffer);GL.bufferData(GL.ARRAY_BUFFER,this.data,b?b:GL.STATIC_DRAW)};b.prototype.bind=function(){GL.bindBuffer(GL.ARRAY_BUFFER,this.buffer);for(var a=this.attributes.length;a--;)this.attributes[a].bind()};\nb.prototype.dispose=function(){this.buffer&&(GL.deleteBuffer(this.buffer),delete this.buffer);delete this.data;if(this.attributes){for(var a=this.attributes.length;a--;)this.attributes[a].dispose();delete this.attributes}};return b}();\nGLOW.Float=function(){function b(a){a!==void 0&&a.length?this.value=new Float32Array(a):(this.value=new Float32Array(1),this.value[0]=a!==void 0?a:0)}b.prototype.set=function(a){this.value[0]=a;return this};b.prototype.add=function(a){this.value[0]+=a;return this};b.prototype.sub=function(a){this.value[0]-=a;return this};b.prototype.multiply=function(a){this.value[0]*=a;return this};b.prototype.divide=function(a){this.value[0]/=a;return this};b.prototype.modulo=function(a){this.value[0]%=a;return this};\nreturn b}();\nGLOW.Int=function(){function b(a){a!==void 0&&a.length?this.value=new Int32Array(a):(this.value=new Int32Array(1),this.value[0]=a!==void 0?a:0)}b.prototype.set=function(a){this.value[0]=a;return this};b.prototype.add=function(a){this.value[0]+=a;return this};b.prototype.sub=function(a){this.value[0]-=a;return this};b.prototype.multiply=function(a){this.value[0]*=a;return this};b.prototype.divide=function(a){this.value[0]/=a;return this};b.prototype.modulo=function(a){this.value[0]%=a;return this};\nreturn b}();GLOW.Bool=function(){function b(a){this.value=[];this.value[0]=a!==void 0?!!a:!1}b.prototype.set=function(a){this.value[0]=!!a;return this};return b}();GLOW.Bool2=function(){function b(a,b){this.value=[];this.value[0]=a!==void 0?!!a:!1;this.value[1]=b!==void 0?!!b:!1}b.prototype.set=function(a,b){this.value[0]=!!a;this.value[1]=!!b;return this};return b}();\nGLOW.Bool3=function(){function b(a,b,f){this.value=[];this.value[0]=a!==void 0?!!a:!1;this.value[1]=b!==void 0?!!b:!1;this.value[2]=f!==void 0?!!f:!1}b.prototype.set=function(a,b,f){this.value[0]=!!a;this.value[1]=!!b;this.value[2]=!!f;return this};return b}();\nGLOW.Bool4=function(){function b(a,b,f,e){this.value=[];this.value[0]=a!==void 0?!!a:!1;this.value[1]=b!==void 0?!!b:!1;this.value[2]=f!==void 0?!!f:!1;this.value[3]=e!==void 0?!!e:!1}b.prototype.set=function(a,b,f,e){this.value[0]=!!a;this.value[1]=!!b;this.value[2]=!!f;this.value[3]=!!e;return this};return b}();\nGLOW.Vector2=function(){function b(a,b){this.value=new Float32Array(2);this.value[0]=a!==void 0?a:0;this.value[1]=b!==void 0?b:0}b.prototype.set=function(a,b){this.value[0]=a;this.value[1]=b;return this};b.prototype.copy=function(a){this.value[0]=a.value[0];this.value[1]=a.value[1];return this};b.prototype.addSelf=function(a){this.value[0]+=a.value[0];this.value[1]+=a.value[1];return this};b.prototype.add=function(a,b){this.value[0]=a.value[0]+b.value[0];this.value[1]=a.value[1]+b.value[1];return this};\nb.prototype.subSelf=function(a){this.value[0]-=a.x;this.value[1]-=a.y;return this};b.prototype.sub=function(a,b){this.value[0]=a.value[0]-b.value[0];this.value[1]=a.value[1]-b.value[1];return this};b.prototype.multiplySelf=function(a){this.value[0]*=a.value[0];this.value[1]*=a.value[1];return this};b.prototype.multiply=function(a,b){this.value[0]=a.value[0]*b.value[0];this.value[1]=a.value[1]*b.value[1];return this};b.prototype.multiplyScalar=function(a){this.value[0]*=a;this.value[1]*=a;return this};\nb.prototype.negate=function(){this.value[0]=-this.value[0];this.value[1]=-this.value[1];return this};b.prototype.normalize=function(){this.multiplyScalar(1/this.length());return this};b.prototype.length=function(){return Math.sqrt(this.lengthSq())};b.prototype.lengthSq=function(){return this.value[0]*this.value[0]+this.value[1]*this.value[1]};b.prototype.clone=function(){return new GLOW.Vector2(this.value[0],this.value[1])};return b}();\nGLOW.Vector3=function(){function b(a,b,f){this.value=new Float32Array(3);this.value[0]=a!==void 0?a:0;this.value[1]=b!==void 0?b:0;this.value[2]=f!==void 0?f:0}b.prototype.set=function(a,b,f){this.value[0]=a;this.value[1]=b;this.value[2]=f;return this};b.prototype.copy=function(a){this.set(a.value[0],a.value[1],a.value[2]);return this};b.prototype.add=function(a,b){a=a.value;b=b.value;this.value[0]=a[0]+b[0];this.value[1]=a[1]+b[1];this.value[2]=a[2]+b[2];return this};b.prototype.addSelf=function(a){a=\na.value;this.value[0]+=a[0];this.value[1]+=a[1];this.value[2]+=a[2];return this};b.prototype.addScalar=function(a){this.value[0]+=a;this.value[1]+=a;this.value[2]+=a;return this};b.prototype.sub=function(a,b){a=a.value;b=b.value;this.value[0]=a[0]-b[0];this.value[1]=a[1]-b[1];this.value[2]=a[2]-b[2];return this};b.prototype.subSelf=function(a){a=a.value;this.value[0]-=a[0];this.value[1]-=a[1];this.value[2]-=a[2];return this};b.prototype.cross=function(a,b){a=a.value;b=b.value;this.value[0]=a[1]*b[2]-\na[2]*b[1];this.value[1]=a[2]*b[0]-a[0]*b[2];this.value[2]=a[0]*b[1]-a[1]*b[0];return this};b.prototype.crossSelf=function(a){var a=a.value,b=a[0],f=a[1],a=a[2],e=this.value[0],g=this.value[1],h=this.value[2];this.value[0]=f*h-a*g;this.value[1]=a*e-b*h;this.value[2]=b*g-f*e;return this};b.prototype.multiply=function(a,b){a=a.value;b=b.value;this.value[0]=a[0]*b[0];this.value[1]=a[1]*b[1];this.value[2]=a[2]*b[2];return this};b.prototype.multiplySelf=function(a){a=a.value;this.value[0]*=a[0];this.value[1]*=\na[1];this.value[2]*=a[2];return this};b.prototype.multiplyScalar=function(a){this.value[0]*=a;this.value[1]*=a;this.value[2]*=a;return this};b.prototype.divideSelf=function(a){a=a.value;this.value[0]/=a[0];this.value[1]/=a[1];this.value[2]/=a[2];return this};b.prototype.divideScalar=function(a){this.value[0]/=a;this.value[1]/=a;this.value[2]/=a;return this};b.prototype.negate=function(){this.value[0]=-this.value[0];this.value[1]=-this.value[1];this.value[2]=-this.value[2];return this};b.prototype.dot=\nfunction(a){a=a.value;return this.value[0]*a[0]+this.value[1]*a[1]+this.value[2]*a[2]};b.prototype.distanceTo=function(a){return Math.sqrt(this.distanceToSquared(a))};b.prototype.distanceToSquared=function(a){var a=a.value,b=this.value[0]-a[0],f=this.value[1]-a[1],a=this.value[2]-a[2];return b*b+f*f+a*a};b.prototype.length=function(){return Math.sqrt(this.lengthSq())};b.prototype.lengthSq=function(){return this.value[0]*this.value[0]+this.value[1]*this.value[1]+this.value[2]*this.value[2]};b.prototype.lengthManhattan=\nfunction(){return this.value[0]+this.value[1]+this.value[2]};b.prototype.normalize=function(){var a=Math.sqrt(this.value[0]*this.value[0]+this.value[1]*this.value[1]+this.value[2]*this.value[2]);a>0?this.multiplyScalar(1/a):this.set(0,0,0);return this};b.prototype.setPositionFromMatrix=function(a){a=a.value;this.value[0]=a[12];this.value[1]=a[13];this.value[2]=a[14]};b.prototype.setLength=function(a){return this.normalize().multiplyScalar(a)};b.prototype.isZero=function(){return Math.abs(this.value[0])<\n1.0E-4&&Math.abs(this.value[1])<1.0E-4&&Math.abs(this.value[2])<1.0E-4};b.prototype.clone=function(){return GLOW.Vector3(this.value[0],this.value[1],this.value[2])};return b}();\nGLOW.Vector4=function(){function b(a,b,f,e){this.value=new Float32Array(4);this.value[0]=a!==void 0?a:0;this.value[1]=b!==void 0?b:0;this.value[2]=f!==void 0?f:0;this.value[3]=e!==void 0?e:0}b.prototype.set=function(a,b,f,e){this.value[0]=a;this.value[1]=b;this.value[2]=f;this.value[3]=e;return this};b.prototype.copy=function(a){this.value[0]=a.value[0];this.value[1]=a.value[1];this.value[2]=a.value[2];this.value[3]=a.value[3];return this};b.prototype.add=function(a,b){this.value[0]=a.value[0]+b.value[0];\nthis.value[1]=a.value[1]+b.value[1];this.value[2]=a.value[2]+b.value[2];this.value[3]=a.value[3]+b.value[3];return this};b.prototype.addSelf=function(a){this.value[0]+=a.value[0];this.value[1]+=a.value[1];this.value[2]+=a.value[2];this.value[3]+=a.value[3];return this};b.prototype.sub=function(a,b){this.value[0]=a.value[0]-b.value[0];this.value[1]=a.value[1]-b.value[1];this.value[2]=a.value[2]-b.value[2];this.value[3]=a.value[3]-b.value[3];return this};b.prototype.subSelf=function(a){this.value[0]-=\na.value[0];this.value[1]-=a.value[1];this.value[2]-=a.value[2];this.value[3]-=a.value[3];return this};b.prototype.multiplyScalar=function(a){this.value[0]*=a;this.value[1]*=a;this.value[2]*=a;this.value[3]*=a;return this};b.prototype.divideScalar=function(a){this.value[0]/=a;this.value[1]/=a;this.value[2]/=a;this.value[3]/=a;return this};b.prototype.lerpSelf=function(a,b){this.value[0]+=(a.x-this.value[0])*b;this.value[1]+=(a.y-this.value[1])*b;this.value[2]+=(a.z-this.value[2])*b;this.value[3]+=\n(a.w-this.value[3])*b;return this};b.prototype.lengthOfXYZ=function(){return Math.sqrt(this.value[0]*this.value[0]+this.value[1]*this.value[1]+this.value[2]*this.value[2])};b.prototype.clone=function(){return new GLOW.Vector4(this.value[0],this.value[1],this.value[2],this.value[3])};return b}();\nGLOW.Matrix3=function(){function b(){this.value=new Float32Array(9);this.identity()}b.prototype.set=function(a,b,f,e,g,h,i,j,k){this.value[0]=a;this.value[3]=b;this.value[6]=f;this.value[1]=e;this.value[4]=g;this.value[7]=h;this.value[2]=i;this.value[5]=j;this.value[8]=k;return this};b.prototype.identity=function(){this.set(1,0,0,0,1,0,0,0,1);return this};b.prototype.extractFromMatrix4=function(a){this.set(a.value[0],a.value[4],a.value[8],a.value[1],a.value[5],a.value[9],a.value[2],a.value[6],a.value[10]);\nreturn this};b.prototype.multiplyVector3=function(a){var b=a.value[0],f=a.value[1],e=a.value[2];a.value[0]=this.value[0]*b+this.value[3]*f+this.value[6]*e;a.value[1]=this.value[1]*b+this.value[4]*f+this.value[7]*e;a.value[2]=this.value[2]*b+this.value[5]*f+this.value[8]*e;return a};return b}();\nGLOW.Matrix4=function(){function b(){this.value=new Float32Array(16);this.rotation=new GLOW.Vector3;this.position=new GLOW.Vector3;this.columnX=new GLOW.Vector3;this.columnY=new GLOW.Vector3;this.columnZ=new GLOW.Vector3;this.identity()}b.prototype.set=function(a,b,f,e,g,h,i,j,k,l,m,o,n,r,p,q){this.value[0]=a;this.value[4]=b;this.value[8]=f;this.value[12]=e;this.value[1]=g;this.value[5]=h;this.value[9]=i;this.value[13]=j;this.value[2]=k;this.value[6]=l;this.value[10]=m;this.value[14]=o;this.value[3]=\nn;this.value[7]=r;this.value[11]=p;this.value[15]=q;return this};b.prototype.identity=function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this};b.prototype.copy=function(a){a=a.value;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this};b.prototype.lookAt=function(a,b){var f=GLOW.Matrix4.tempVector3A,e=GLOW.Matrix4.tempVector3B,g=GLOW.Matrix4.tempVector3C,h=this.getPosition();h.value[0]=this.value[12];h.value[1]=this.value[13];h.value[2]=\nthis.value[14];g.sub(h,a).normalize();g.length()===0&&(g.value[3]=1);f.cross(b,g).normalize();f.length()===0&&(g.value[0]+=1.0E-4,f.cross(b,g).normalize());e.cross(g,f).normalize();f=f.value;e=e.value;g=g.value;this.value[0]=f[0];this.value[4]=e[0];this.value[8]=g[0];this.value[1]=f[1];this.value[5]=e[1];this.value[9]=g[1];this.value[2]=f[2];this.value[6]=e[2];this.value[10]=g[2];return this};b.prototype.multiplyVector3=function(a){var b=a.value[0],f=a.value[1],e=a.value[2],g=1/(this.value[3]*b+this.value[7]*\nf+this.value[11]*e+this.value[15]);a.value[0]=(this.value[0]*b+this.value[4]*f+this.value[8]*e+this.value[12])*g;a.value[1]=(this.value[1]*b+this.value[5]*f+this.value[9]*e+this.value[13])*g;a.value[2]=(this.value[2]*b+this.value[6]*f+this.value[10]*e+this.value[14])*g;return a};b.prototype.multiplyVector4=function(a){var b=a.value[0],f=a.value[1],e=a.value[2],g=a.value[3];a.value[0]=this.value[0]*b+this.value[4]*f+this.value[8]*e+this.value[12]*g;a.value[1]=this.value[1]*b+this.value[5]*f+this.value[9]*\ne+this.value[13]*g;a.value[2]=this.value[2]*b+this.value[6]*f+this.value[10]*e+this.value[14]*g;a.value[3]=this.value[3]*b+this.value[7]*f+this.value[11]*e+this.value[15]*g;return a};b.prototype.rotateAxis=function(a){var b=a.value[0],f=a.value[1],e=a.value[2];a.value[0]=b*this.value[0]+f*this.value[4]+e*this.value[8];a.value[1]=b*this.value[1]+f*this.value[5]+e*this.value[9];a.value[2]=b*this.value[2]+f*this.value[6]+e*this.value[10];a.normalize();return a};b.prototype.crossVector=function(a){var b=\nGLOW.Vector4(),f=a.value[0],e=a.value[1],g=a.value[2],a=a.value[3];b.value[0]=this.value[0]*f+this.value[4]*e+this.value[8]*g+this.value[12]*a;b.value[1]=this.value[1]*f+this.value[5]*e+this.value[9]*g+this.value[13]*a;b.value[2]=this.value[2]*f+this.value[6]*e+this.value[10]*g+this.value[14]*a;b.value[3]=a?this.value[3]*f+this.value[7]*e+this.value[11]*g+this.value[15]*a:1;return b};b.prototype.multiply=function(a,b){var a=a.value,b=b.value,f=a[0],e=a[4],g=a[8],h=a[12],i=a[1],j=a[5],k=a[9],l=a[13],\nm=a[2],o=a[6],n=a[10],r=a[14],p=a[3],q=a[7],s=a[11],t=a[15],u=b[0],v=b[4],x=b[8],w=b[12],y=b[1],z=b[5],A=b[9],B=b[13],C=b[2],D=b[6],E=b[10],F=b[14];this.value[0]=f*u+e*y+g*C;this.value[4]=f*v+e*z+g*D;this.value[8]=f*x+e*A+g*E;this.value[12]=f*w+e*B+g*F+h;this.value[1]=i*u+j*y+k*C;this.value[5]=i*v+j*z+k*D;this.value[9]=i*x+j*A+k*E;this.value[13]=i*w+j*B+k*F+l;this.value[2]=m*u+o*y+n*C;this.value[6]=m*v+o*z+n*D;this.value[10]=m*x+o*A+n*E;this.value[14]=m*w+o*B+n*F+r;this.value[3]=p*u+q*y+s*C;this.value[7]=\np*v+q*z+s*D;this.value[11]=p*x+q*A+s*E;this.value[15]=p*w+q*B+s*F+t;return this};b.prototype.multiplySelf=function(a){this.multiply(this,a);return this};b.prototype.multiplyScalar=function(a){this.value[0]*=a;this.value[4]*=a;this.value[8]*=a;this.value[12]*=a;this.value[1]*=a;this.value[5]*=a;this.value[9]*=a;this.value[13]*=a;this.value[2]*=a;this.value[6]*=a;this.value[10]*=a;this.value[14]*=a;this.value[3]*=a;this.value[7]*=a;this.value[11]*=a;this.value[15]*=a;return this};b.prototype.determinant=\nfunction(){var a=this.value[0],b=this.value[4],f=this.value[8],e=this.value[12],g=this.value[1],h=this.value[5],i=this.value[9],j=this.value[13],k=this.value[2],l=this.value[6],m=this.value[10],o=this.value[14],n=this.value[3],r=this.value[7],p=this.value[11],q=this.value[15];return e*i*l*n-f*j*l*n-e*h*m*n+b*j*m*n+f*h*o*n-b*i*o*n-e*i*k*r+f*j*k*r+e*g*m*r-a*j*m*r-f*g*o*r+a*i*o*r+e*h*k*p-b*j*k*p-e*g*l*p+a*j*l*p+b*g*o*p-a*h*o*p-f*h*k*q+b*i*k*q+f*g*l*q-a*i*l*q-b*g*m*q+a*h*m*q};b.prototype.transpose=function(){var a;\na=this.value[1];this.value[1]=this.value[4];this.value[4]=a;a=this.value[2];this.value[2]=this.value[8];this.value[8]=a;a=this.value[6];this.value[6]=this.value[9];this.value[9]=a;a=this.value[3];this.value[3]=this.value[12];this.value[12]=a;a=this.value[7];this.value[7]=this.value[13];this.value[13]=a;a=this.value[11];this.value[11]=this.value[14];this.value[11]=a;return this};b.prototype.clone=function(){var a=new GLOW.Matrix4;a.value=new Float32Array(this.value);return a};b.prototype.setPosition=\nfunction(a,b,f){var e;b!==void 0&&f!==void 0?e=a:(e=a.value[0],b=a.value[1],f=a.value[2]);this.value[12]=e;this.value[13]=b;this.value[14]=f;return this};b.prototype.addPosition=function(a,b,f){var e;b!==void 0&&f!==void 0?e=a:(e=a.value[0],b=a.value[1],f=a.value[2]);this.value[12]+=e;this.value[13]+=b;this.value[14]+=f};b.prototype.setRotation=function(a,b,f){var e;b!==void 0&&f!==void 0?e=a:(e=a.value[0],b=a.value[1],f=a.value[2]);var a=Math.cos(b),b=Math.sin(b),g=Math.cos(f),f=Math.sin(f),h=Math.cos(e);\ne=Math.sin(e);this.value[0]=a*g;this.value[4]=b*e-a*f*h;this.value[8]=a*f*e+b*h;this.value[1]=f;this.value[5]=g*h;this.value[9]=-g*e;this.value[2]=-b*g;this.value[6]=b*f*h+a*e;this.value[10]=-b*f*e+a*h;return this};b.prototype.addRotation=function(a,b,f){var e;b!==void 0&&f!==void 0?e=a:(e=a.value[0],b=a.value[1],f=a.value[2]);this.rotation.value[0]+=e;this.rotation.value[1]+=b;this.rotation.value[2]+=f;this.setRotation(this.rotation.value[0],this.rotation.value[1],this.rotation.value[2])};b.prototype.getPosition=\nfunction(){this.position.set(this.value[12],this.value[13],this.value[14]);return this.position};b.prototype.getColumnX=function(){this.columnX.set(this.value[0],this.value[1],this.value[2]);return this.columnX};b.prototype.getColumnY=function(){this.columnY.set(this.value[4],this.value[5],this.value[6]);return this.columnY};b.prototype.getColumnZ=function(){this.columnZ.set(this.value[8],this.value[9],this.value[10]);return this.columnZ};b.prototype.scale=function(a,b,f){var e;b!==void 0&&f!==void 0?\ne=a:(e=a.value[0],b=a.value[1],f=a.value[2]);this.value[0]*=e;this.value[4]*=b;this.value[8]*=f;this.value[1]*=e;this.value[5]*=b;this.value[9]*=f;this.value[2]*=e;this.value[6]*=b;this.value[10]*=f;this.value[3]*=e;this.value[7]*=b;this.value[11]*=f;return this};b.prototype.invert=function(){GLOW.Matrix4.makeInverse(this,this);return this};return b}();\nGLOW.Matrix4.makeInverse=function(b,a){a===void 0&&(a=new GLOW.Matrix4);var c=b.value,f=a.value,e=c[0],g=c[4],h=c[8],i=c[12],j=c[1],k=c[5],l=c[9],m=c[13],o=c[2],n=c[6],r=c[10],p=c[14],q=c[3],s=c[7],t=c[11],c=c[15];f[0]=l*p*s-m*r*s+m*n*t-k*p*t-l*n*c+k*r*c;f[1]=m*r*q-l*p*q-m*o*t+j*p*t+l*o*c-j*r*c;f[2]=k*p*q-m*n*q+m*o*s-j*p*s-k*o*c+j*n*c;f[3]=l*n*q-k*r*q-l*o*s+j*r*s+k*o*t-j*n*t;f[4]=i*r*s-h*p*s-i*n*t+g*p*t+h*n*c-g*r*c;f[5]=h*p*q-i*r*q+i*o*t-e*p*t-h*o*c+e*r*c;f[6]=i*n*q-g*p*q-i*o*s+e*p*s+g*o*c-e*n*c;\nf[7]=g*r*q-h*n*q+h*o*s-e*r*s-g*o*t+e*n*t;f[8]=h*m*s-i*l*s+i*k*t-g*m*t-h*k*c+g*l*c;f[9]=i*l*q-h*m*q-i*j*t+e*m*t+h*j*c-e*l*c;f[10]=h*m*q-i*k*q+i*j*s-e*m*s-g*j*c+e*k*c;f[11]=h*k*q-g*l*q-h*j*s+e*l*s+g*j*t-e*k*t;f[12]=i*l*n-h*m*n-i*k*r+g*m*r+h*k*p-g*l*p;f[13]=h*m*o-i*l*o+i*j*r-e*m*r-h*j*p+e*l*p;f[14]=i*k*o-g*m*o-i*j*n+e*m*n+g*j*p-e*k*p;f[15]=g*l*o-h*k*o+h*j*n-e*l*n-g*j*r+e*k*r;a.multiplyScalar(1/b.determinant());return a};\nGLOW.Matrix4.makeFrustum=function(b,a,c,f,e,g,h){var i,h=h||new GLOW.Matrix4;i=h.value;i[0]=2*e/(a-b);i[4]=0;i[8]=(a+b)/(a-b);i[12]=0;i[1]=0;i[5]=2*e/(f-c);i[9]=(f+c)/(f-c);i[13]=0;i[2]=0;i[6]=0;i[10]=-(g+e)/(g-e);i[14]=-2*g*e/(g-e);i[3]=0;i[7]=0;i[11]=-1;i[15]=0;return h};GLOW.Matrix4.makeProjection=function(b,a,c,f,e){var g,b=c*Math.tan(b*Math.PI/360);g=-b;return GLOW.Matrix4.makeFrustum(g*a,b*a,g,b,c,f,e)};\nGLOW.Matrix4.makeOrtho=function(b,a,c,f,e,g,h){var i,j,k,l,h=h||new GLOW.Matrix4;j=Math.abs(a-b);k=Math.abs(c-f);l=Math.abs(g-e);i=h.value;i[0]=2/j;i[4]=0;i[8]=0;i[12]=-((a+b)/j);i[1]=0;i[5]=2/k;i[9]=0;i[13]=-((c+f)/k);i[2]=0;i[6]=0;i[10]=-2/l;i[14]=-((g+e)/l);i[3]=0;i[7]=0;i[11]=0;i[15]=1;return h};GLOW.Matrix4.tempVector3A=new GLOW.Vector3;GLOW.Matrix4.tempVector3B=new GLOW.Vector3;GLOW.Matrix4.tempVector3C=new GLOW.Vector3;GLOW.Matrix4.tempVector3D=new GLOW.Vector3;\nGLOW.Color=function(){function b(a,b,f){this.value=new Float32Array(3);b===void 0&&f===void 0?this.setHex(a||0):this.setRGB(a,b,f)}b.prototype.setRGB=function(a,b,f){this.value[0]=a!==void 0?a/255:1;this.value[1]=b!==void 0?b/255:1;this.value[2]=f!==void 0?f/255:1;return this};b.prototype.setHex=function(a){this.value[0]=((a&16711680)>>16)/255;this.value[1]=((a&65280)>>8)/255;this.value[2]=(a&255)/255;return this};b.prototype.multiplyScalar=function(a){this.value[0]*=a;this.value[1]*=a;this.value[2]*=\na;return this};b.prototype.mix=function(a,b){var f=1-b;this.value[0]=this.value[0]*f+a.value[0]*b;this.value[1]=this.value[1]*f+a.value[1]*b;this.value[2]=this.value[2]*f+a.value[2]*b;return this};b.prototype.copy=function(a){this.value[0]=a.value[0];this.value[1]=a.value[1];this.value[2]=a.value[2];return this};b.prototype.setHSV=function(a,b,f){var e,g,h,i,j,k;if(f==0)e=g=h=0;else switch(i=Math.floor(a*6),j=a*6-i,a=f*(1-b),k=f*(1-b*j),b=f*(1-b*(1-j)),i){case 1:e=k;g=f;h=a;break;case 2:e=a;g=f;h=\nb;break;case 3:e=a;g=k;h=f;break;case 4:e=b;g=a;h=f;break;case 5:e=f;g=a;h=k;break;case 6:case 0:e=f,g=b,h=a}this.value[0]=e;this.value[1]=g;this.value[2]=h;return this};return b}();\nGLOW.Geometry={randomVector3Array:function(b,a){var a=a!==void 0?a:1,c,f=[],e=a*2;for(c=0;c<b;c++)f.push(GLOW.Vector3(Math.random()*e-a,Math.random()*e-a,Math.random()*e-a));return f},randomArray:function(b,a,c,f){var e=[],g=0,h,i;for(i=0;i<b/f;i++){g=a+Math.random()*c;for(h=0;h<f;h++)e.push(g)}return e},triangles:function(b){return this.elements(b)},elements:function(b){var a=0,c,f=new Uint16Array(b*3);for(c=0;c<b;c++)f[a]=a++,f[a]=a++,f[a]=a++;return f},faceNormals:function(b,a){var c=Array(b.length),\nf,e=a.length,g,h,i,j=new GLOW.Vector3,k=new GLOW.Vector3,l=new GLOW.Vector3,m=new GLOW.Vector3;for(f=0;f<e;)g=a[f++]*3,h=a[f++]*3,i=a[f++]*3,j.set(b[g+0],b[g+1],b[g+2]),k.set(b[h+0],b[h+1],b[h+2]),l.set(b[i+0],b[i+1],b[i+2]),k.subSelf(j),l.subSelf(j),m.cross(k,l).normalize(),c[g+0]=m.value[0],c[g+1]=m.value[1],c[g+2]=m.value[2],c[h+0]=m.value[0],c[h+1]=m.value[1],c[h+2]=m.value[2],c[i+0]=m.value[0],c[i+1]=m.value[1],c[i+2]=m.value[2];return c},flatShade:function(b,a){if(b.triangles===void 0||b.data===\nvoid 0)GLOW.error(\"GLOW.Geometry.flatShade: missing .data and/or .triangles in shader config object. Quitting.\");else if(a===void 0)GLOW.error(\"GLOW.Geometry.flatShade: missing attribute data sizes. Quitting.\");else{var c=b.triangles,f=c.length/3,e=b.data,g=[],h,i,j,k,l,m,o;for(j in a)if(e[j]){h=e[j];flatShadedAttribute=[];i=a[j];k=0;for(l=f*3;k<l;k++){m=0;for(o=i;m<o;m++)flatShadedAttribute.push(h[c[k]*i+m])}k=h.length=0;for(l=flatShadedAttribute.length;k<l;k++)h[k]=flatShadedAttribute[k]}k=0;l=\nf;for(m=0;k<l;k++)g[m]=m++,g[m]=m++,g[m]=m++;b.triangles=g}}};\nGLOW.Geometry.Cube={vertices:function(b){var a=new Float32Array(72),c=0,b=b!==void 0?b*0.5:5;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=+b;\na[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=+b;a[c++]=-b;a[c++]=-b;a[c++]=+b;return a},indices:function(){var b=new Uint16Array(36),a=0;b[a++]=0;b[a++]=1;b[a++]=2;b[a++]=0;b[a++]=2;b[a++]=3;b[a++]=4;b[a++]=5;b[a++]=6;b[a++]=4;b[a++]=6;b[a++]=7;b[a++]=8;b[a++]=9;b[a++]=\n10;b[a++]=8;b[a++]=10;b[a++]=11;b[a++]=12;b[a++]=13;b[a++]=14;b[a++]=12;b[a++]=14;b[a++]=15;b[a++]=16;b[a++]=17;b[a++]=18;b[a++]=16;b[a++]=18;b[a++]=19;b[a++]=20;b[a++]=21;b[a++]=22;b[a++]=20;b[a++]=22;b[a++]=23;return b},primitives:function(){return GL.TRIANGLES},uvs:function(){var b=new Float32Array(48),a=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=\n0;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=0;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=1;b[a++]=0;b[a++]=0;b[a++]=0;return b},normals:function(){return GLOW.Geometry.faceNormals(GLOW.Geometry.Cube.vertices(),GLOW.Geometry.Cube.indices())}};\nGLOW.Geometry.Cylinder={vertices:function(b,a,c,f){b|=7;a|=1;c|=1;f|=1;for(var e=[],g=Math.PI*2,h=f*0.5,f=0;f<b;f++)e.push(Math.sin(g*f/b)*a),e.push(h),e.push(Math.cos(g*f/b)*a);for(f=0;f<b;f++)e.push(Math.sin(g*f/b)*c),e.push(-h),e.push(Math.cos(g*f/b)*c);e.push(0);e.push(h);e.push(0);e.push(0);e.push(-h);e.push(0);return e},indices:function(b){b|=7;var a,c,f,e,g,h=[];for(g=0;g<b;g++)a=g,c=g+b,f=b+(g+1)%b,e=(g+1)%b,h.push(a),h.push(c),h.push(f),h.push(a),h.push(f),h.push(e);for(g=b;g<b+b*0.5;g++)a=\n2*b,c=(2*g-2*b+0)%b,f=(2*g-2*b+1)%b,e=(2*g-2*b+2)%b,h.push(a),h.push(c),h.push(f),h.push(a),h.push(f),h.push(e);for(g=b+b*0.5;g<2*b;g++)a=2*b+1,c=(2*g-2*b+2)%b+b,f=(2*g-2*b+1)%b+b,e=(2*g-2*b+0)%b+b,h.push(a),h.push(c),h.push(f),h.push(a),h.push(f),h.push(e);return h},uvs:function(){},primitives:function(){return GL.TRIANGLES},normals:function(b){return GLOW.Geometry.faceNormals(GLOW.Geometry.Cylinder.vertices(b),GLOW.Geometry.Cylinder.indices(b))}};\nGLOW.Geometry.Plane={vertices:function(b,a){var c=new Float32Array(12),f=0,b=b!==void 0?b*0.5:1;a?(c[f++]=-b,c[f++]=0,c[f++]=-b,c[f++]=-b,c[f++]=0,c[f++]=+b,c[f++]=+b,c[f++]=0,c[f++]=+b,c[f++]=+b,c[f++]=0,c[f++]=-b):(c[f++]=+b,c[f++]=-b,c[f++]=0,c[f++]=+b,c[f++]=+b,c[f++]=0,c[f++]=-b,c[f++]=+b,c[f++]=0,c[f++]=-b,c[f++]=-b,c[f++]=0);return c},indices:function(){var b=new Uint16Array(6),a=0;b[a++]=0;b[a++]=1;b[a++]=2;b[a++]=0;b[a++]=2;b[a++]=3;return b},uvs:function(b){var a=new Float32Array(8),c=0;\nb?(a[c++]=0,a[c++]=0,a[c++]=0,a[c++]=1,a[c++]=1,a[c++]=1,a[c++]=1):(a[c++]=1,a[c++]=0,a[c++]=1,a[c++]=1,a[c++]=0,a[c++]=1,a[c++]=0);a[c++]=0;return a},primitives:function(){return GL.TRIANGLES}};\nGLOW.Node=function(b){this.localMatrix=new GLOW.Matrix4;this.globalMatrix=new GLOW.Matrix4;this.viewMatrix=new GLOW.Matrix4;this.updateRotationMatrix=!1;this.rotationMatrix=new GLOW.Matrix3;this.useXYZStyleTransform=!1;this.position={x:0,y:0,z:0};this.rotation={x:0,y:0,z:0};this.scale={x:1,y:1,z:1};this.children=[];this.parent=void 0;if(b)this.shader=b,this.draw=b.draw};\nGLOW.Node.prototype.update=function(b,a){this.useXYZStyleTransform&&(this.localMatrix.setPosition(this.position.x,this.position.y,this.position.z),this.localMatrix.setRotation(this.rotation.x,this.rotation.y,this.rotation.z),this.localMatrix.scale(this.scale.x,this.scale.y,this.scale.z));b?this.globalMatrix.multiply(b,this.localMatrix):this.globalMatrix.copy(this.localMatrix);this.updateRotationMatrix&&this.rotationMatrix.extractFromMatrix4(this.globalMatrix);a&&this.viewMatrix.multiply(a,this.globalMatrix);\nvar c,f=this.children.length;for(c=0;c<f;c++)this.children[c].update(this.globalMatrix,a);return this};GLOW.Node.prototype.addChild=function(b){if(this.children.indexOf(b)===-1)this.children.push(b),b.parent&&b.parent.removeChild(b),b.parent=this;return this};GLOW.Node.prototype.removeChild=function(b){var a=this.children.indexOf(b);if(a!==-1)this.children.splice(1,a),b.parent=void 0;return this};\nGLOW.Camera=function(b){GLOW.Node.call(this);b=b!==void 0?b:{};this.fov=b.fov!==void 0?b.fov:40;this.aspect=b.aspect!==void 0?b.aspect:window.innerWidth/window.innerHeight;this.near=b.near!==void 0?b.near:0.1;this.far=b.far!==void 0?b.far:1E4;this.useTarget=b.useTarget!==void 0?b.useTarget:!0;this.projection=b.ortho!==void 0?GLOW.Matrix4.makeOrtho(b.ortho.left,b.ortho.right,b.ortho.top,b.ortho.bottom,this.near,this.far):GLOW.Matrix4.makeProjection(this.fov,this.aspect,this.near,this.far);this.inverse=\nnew GLOW.Matrix4;this.target=new GLOW.Vector3(0,0,-100);this.up=new GLOW.Vector3(0,1,0);this.update()};GLOW.Camera.prototype=new GLOW.Node;GLOW.Camera.prototype.constructor=GLOW.Camera;GLOW.Camera.prototype.supr=GLOW.Node.prototype;\nGLOW.Camera.prototype.update=function(b,a){this.useXYZStyleTransform?(this.localMatrix.setPosition(this.position.x,this.position.y,this.position.z),this.useTarget?this.localMatrix.lookAt(this.target,this.up):this.localMatrix.setRotation(this.rotation.x,this.rotation.y,this.rotation.z),this.localMatrix.scale(this.scale.x,this.scale.y,this.scale.z)):this.useTarget&&this.localMatrix.lookAt(this.target,this.up);b?this.globalMatrix.multiply(b,this.localMatrix):this.globalMatrix.copy(this.localMatrix);\nGLOW.Matrix4.makeInverse(this.globalMatrix,this.inverse);var c,f=this.children.length;for(c=0;c<f;c++)this.children[c].update(this.globalMatrix,a)};GLOW.defaultCamera=new GLOW.Camera;\nGLOW.Load=function(){function b(a){this.parameters=a;this.onLoadComplete=void 0;this.onLoadContext=null;this.onLoadItem=void 0;this.numItemsLeftToLoad=this.numItemsToLoad=0;for(var b in a)b!==\"onLoadComplete\"&&b!==\"onLoadItem\"&&b!==\"dontParseJS\"&&b!=\"onLoadContext\"?this.numItemsToLoad++:(this[b]=a[b],delete a[b]);this.numItemsLeftToLoad=this.numItemsToLoad;for(b in a){var f=a[b],e=a[b];e.indexOf(\".png\")!==-1||e.indexOf(\".gif\")!==-1||e.indexOf(\".jpg\")!==-1||e.indexOf(\"jpeg\")!==-1?(a[b]=new Image,a[b].scope=\nthis,a[b].onload=this.onLoadImage,a[b].onerror=this.onLoadError,a[b].onabort=this.onLoadError,a[b].src=f):e.indexOf(\".glsl\")!==-1?(a[b]=new XMLHttpRequest,a[b].scope=this,a[b].parametersProperty=b,a[b].open(\"GET\",f),a[b].onreadystatechange=this.onLoadGLSL,a[b].onerror=this.onLoadError,a[b].onabort=this.onLoadError,a[b].send()):e.indexOf(\".js\")!==-1||e.indexOf(\".json\")!==-1?(a[b]=new XMLHttpRequest,a[b].scope=this,a[b].parametersProperty=b,a[b].open(\"GET\",f),a[b].onreadystatechange=this.onLoadJSON,\na[b].onerror=this.onLoadError,a[b].onabort=this.onLoadError,a[b].send()):(a[b]=document.createElement(\"video\"),a[b].scope=this,a[b].addEventListener(\"loadeddata\",this.onLoadVideo,!1),a[b].src=f)}}b.prototype.handleLoadedItem=function(){this.numItemsLeftToLoad--;this.onLoadItem!==void 0&&this.onLoadItem.call(this.onLoadContext,1-this.numItemsLeftToLoad/this.numItemsToLoad);this.numItemsLeftToLoad<=0&&this.onLoadComplete.call(this.onLoadContext,this.parameters)};b.prototype.onLoadJSON=function(){this.readyState===\n4&&(this.scope.parameters[this.parametersProperty]=JSON.parse(this.responseText),this.scope.handleLoadedItem())};b.prototype.onLoadImage=function(){this.scope.handleLoadedItem()};b.prototype.onLoadVideo=function(){this.removeEventListener(\"loadeddata\",this.scope.onLoadVideo,!1);this.scope.handleLoadedItem()};b.prototype.onLoadGLSL=function(){if(this.readyState===4){for(var a=\"\",b=\"\",b=this.responseText.split(\"\\n\"),f=\"\",e=0;e<b.length;e++)if(b[e].indexOf(\"//#\")>-1)b[e].indexOf(\"Fragment\")>-1&&(a=f,\nf=\"\");else{var g=b[e];g.indexOf(\"//\")>-1&&(g=g.substring(0,g.indexOf(\"//\")));g.indexOf(\";\")===-1&&(g+=\"\\n\");f+=g}this.scope.parameters[this.parametersProperty]={fragmentShader:\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\n\"+f,vertexShader:a};this.scope.handleLoadedItem()}};b.prototype.onLoadError=function(a){GLOW.error(\"GLOW.Load.onLoadError: Error \"+a.target.status)};b.prototype.parseThreeJS=function(a){var b={},f=a.scale!==void 0?1/a.scale:1;(function(e){if(a.version===void 0||a.version!=2)GLOW.error(\"Deprecated file format.\");\nelse{var f,h,i,j,k,l,m,o,n,r,p,q,s,t,u=a.faces;l=a.vertices;var v=a.normals,x=a.colors,w=0;for(f=0;f<a.uvs.length;f++)a.uvs[f].length&&w++;for(f=0;f<w;f++)b.faceUvs[f]=[],b.faceVertexUvs[f]=[];j=0;for(k=l.length;j<k;)m=new THREE.Vertex,m.position.x=l[j++]*e,m.position.y=l[j++]*e,m.position.z=l[j++]*e,b.vertices.push(m);j=0;for(k=u.length;j<k;){e=u[j++];l=e&1;i=e&2;f=e&4;h=e&8;o=e&16;m=e&32;r=e&64;e&=128;l?(p=new THREE.Face4,p.a=u[j++],p.b=u[j++],p.c=u[j++],p.d=u[j++],l=4):(p=new THREE.Face3,p.a=u[j++],\np.b=u[j++],p.c=u[j++],l=3);if(i)i=u[j++],p.materials=b.materials[i];i=b.faces.length;if(f)for(f=0;f<w;f++)q=a.uvs[f],n=u[j++],t=q[n*2],n=q[n*2+1],b.faceUvs[f][i]=new THREE.UV(t,n);if(h)for(f=0;f<w;f++){q=a.uvs[f];s=[];for(h=0;h<l;h++)n=u[j++],t=q[n*2],n=q[n*2+1],s[h]=new THREE.UV(t,n);b.faceVertexUvs[f][i]=s}if(o)o=u[j++]*3,h=new THREE.Vector3,h.x=v[o++],h.y=v[o++],h.z=v[o],p.normal=h;if(m)for(f=0;f<l;f++)o=u[j++]*3,h=new THREE.Vector3,h.x=v[o++],h.y=v[o++],h.z=v[o],p.vertexNormals.push(h);if(r)m=\nu[j++],m=new THREE.Color(x[m]),p.color=m;if(e)for(f=0;f<l;f++)m=u[j++],m=new THREE.Color(x[m]),p.vertexColors.push(m);b.faces.push(p)}}})(f);(function(){var e,f,h,i;if(a.skinWeights){e=0;for(f=a.skinWeights.length;e<f;e+=2)h=a.skinWeights[e],i=a.skinWeights[e+1],b.skinWeights.push(new THREE.Vector4(h,i,0,0))}if(a.skinIndices){e=0;for(f=a.skinIndices.length;e<f;e+=2)h=a.skinIndices[e],i=a.skinIndices[e+1],b.skinIndices.push(new THREE.Vector4(h,i,0,0))}b.bones=a.bones;b.animation=a.animation})();(function(e){if(a.morphTargets!==\nvoid 0){var f,h,i,j,k,l,m,o,n;f=0;for(h=a.morphTargets.length;f<h;f++){b.morphTargets[f]={};b.morphTargets[f].name=a.morphTargets[f].name;b.morphTargets[f].vertices=[];o=b.morphTargets[f].vertices;n=a.morphTargets[f].vertices;i=0;for(j=n.length;i<j;i+=3)k=n[i]*e,l=n[i+1]*e,m=n[i+2]*e,o.push(new THREE.Vertex(new THREE.Vector3(k,l,m)))}}if(a.morphColors!==void 0){f=0;for(h=a.morphColors.length;f<h;f++){b.morphColors[f]={};b.morphColors[f].name=a.morphColors[f].name;b.morphColors[f].colors=[];j=b.morphColors[f].colors;\nk=a.morphColors[f].colors;e=0;for(i=k.length;e<i;e+=3)l=new THREE.Color(16755200),l.setRGB(k[e],k[e+1],k[e+2]),j.push(l)}}})(f);(function(){if(a.edges!==void 0){var e,f,h;for(e=0;e<a.edges.length;e+=2)f=a.edges[e],h=a.edges[e+1],b.edges.push(new THREE.Edge(b.vertices[f],b.vertices[h],f,h))}})()};return b}();\nGLOW.ShaderUtils={createMultiple:function(b,a){if(b.triangles===void 0||b.data===void 0)GLOW.error(\"GLOW.ShaderUtils.createMultiple: missing .data and/or .triangles in shader config object. Quitting.\");else{var c,f=b.triangles,e=b.data,g,h=[],i,j,k,l,m,o,n=0,r=f.length;do{h.push(g={elements:[]});c=g.elements;for(k in a)if(e[k])g[k]=[];else{GLOW.error(\"GLOW.ShaderUtils.createMultiple: attribute \"+d+\" doesn't exist in originalShaderConfig.data. Quitting.\");return}for(j=0;n<r;n+=3){if(j>65533){n-=3;\nbreak}c[j]=j++;c[j]=j++;c[j]=j++;for(k in a){i=e[k];size=a[k];for(o=0;o<3;o++){l=0;for(m=size;l<m;l++)g[k].push(i[f[n+o]*size+l])}}}}while(n<r);for(k in a)b.data[k]=h[0][k];b.triangles=h[0].elements;c=new GLOW.Shader(b);f=[c];for(n=1;n<h.length;n++){for(k in a)b.data[k]=h[n][k];e=GLOW.Compiler.createAttributes(GLOW.Compiler.extractAttributes(c.compiledData.program),b.data,b.usage,b.interleave);e=GLOW.Compiler.interleaveAttributes(e,b.interleave);for(l in e)h[n][l]=e[l];f[n]=c.clone(h[n])}return f}}};\n"
  },
  {
    "path": "Resources/models/bunny.js",
    "content": "var BUNNY = {\"positions\":[[1.301895,0.122622,2.550061],[1.045326,0.139058,2.835156],[0.569251,0.155925,2.805125],[0.251886,0.144145,2.82928],[0.063033,0.131726,3.01408],[-0.277753,0.135892,3.10716],[-0.441048,0.277064,2.594331],[-1.010956,0.095285,2.668983],[-1.317639,0.069897,2.325448],[-0.751691,0.264681,2.381496],[0.684137,0.31134,2.364574],[1.347931,0.302882,2.201434],[-1.736903,0.029894,1.724111],[-1.319986,0.11998,0.912925],[1.538077,0.157372,0.481711],[1.951975,0.081742,1.1641],[1.834768,0.095832,1.602682],[2.446122,0.091817,1.37558],[2.617615,0.078644,0.742801],[-1.609748,0.04973,-0.238721],[-1.281973,0.230984,-0.180916],[-1.074501,0.248204,0.034007],[-1.201734,0.058499,0.402234],[-1.444454,0.054783,0.149579],[-4.694605,5.075882,1.043427],[-3.95963,7.767394,0.758447],[-4.753339,5.339817,0.665061],[-1.150325,9.133327,-0.368552],[-4.316107,2.893611,0.44399],[-0.809202,9.312575,-0.466061],[0.085626,5.963693,1.685666],[-1.314853,9.00142,-0.1339],[-4.364182,3.072556,1.436712],[-2.022074,7.323396,0.678657],[1.990887,6.13023,0.479643],[-3.295525,7.878917,1.409353],[0.571308,6.197569,0.670657],[0.89661,6.20018,0.337056],[0.331851,6.162372,1.186371],[-4.840066,5.599874,2.296069],[2.138989,6.031291,0.228335],[0.678923,6.026173,1.894052],[-0.781682,5.601573,1.836738],[1.181315,6.239007,0.393293],[-3.606308,7.376476,2.661452],[-0.579059,4.042511,-1.540883],[-3.064069,8.630253,-2.597539],[-2.157271,6.837012,0.300191],[-2.966013,7.821581,-1.13697],[-2.34426,8.122965,0.409043],[-0.951684,5.874251,1.415119],[-2.834853,7.748319,0.182406],[-3.242493,7.820096,0.373674],[-0.208532,5.992846,1.252084],[-3.048085,8.431527,-2.129795],[1.413245,5.806324,2.243906],[-0.051222,6.064901,0.696093],[-4.204306,2.700062,0.713875],[-4.610997,6.343405,0.344272],[-3.291336,9.30531,-3.340445],[-3.27211,7.559239,-2.324016],[-4.23882,6.498344,3.18452],[-3.945317,6.377804,3.38625],[-4.906378,5.472265,1.315193],[-3.580131,7.846717,0.709666],[-1.995504,6.645459,0.688487],[-2.595651,7.86054,0.793351],[-0.008849,0.305871,0.184484],[-0.029011,0.314116,-0.257312],[-2.522424,7.565392,1.804212],[-1.022993,8.650826,-0.855609],[-3.831265,6.595426,3.266783],[-4.042525,6.855724,3.060663],[-4.17126,7.404742,2.391387],[3.904526,3.767693,0.092179],[0.268076,6.086802,1.469223],[-3.320456,8.753222,-2.08969],[1.203048,6.26925,0.612407],[-4.406479,2.985974,0.853691],[-3.226889,6.615215,-0.404243],[0.346326,1.60211,3.509858],[-3.955476,7.253323,2.722392],[-1.23204,0.068935,1.68794],[0.625436,6.196455,1.333156],[4.469132,2.165298,1.70525],[0.950053,6.262899,0.922441],[-2.980404,5.25474,-0.663155],[-4.859043,6.28741,1.537081],[-3.077453,4.641475,-0.892167],[-0.44002,8.222503,-0.771454],[-4.034112,7.639786,0.389935],[-3.696045,6.242042,3.394679],[-1.221806,7.783617,0.196451],[0.71461,6.149895,1.656636],[-4.713539,6.163154,0.495369],[-1.509869,0.913044,-0.832413],[-1.547249,2.066753,-0.852669],[-3.757734,5.793742,3.455794],[-0.831911,0.199296,1.718536],[-3.062763,7.52718,-1.550559],[0.938688,6.103354,1.820958],[-4.037033,2.412311,0.988026],[-4.130746,2.571806,1.101689],[-0.693664,9.174283,-0.952323],[-1.286742,1.079679,-0.751219],[1.543185,1.408925,3.483132],[1.535973,2.047979,3.655029],[0.93844,5.84101,2.195219],[-0.684401,5.918492,1.20109],[1.28844,2.008676,3.710781],[-3.586722,7.435506,-1.454737],[-0.129975,4.384192,2.930593],[-1.030531,0.281374,3.214273],[-3.058751,8.137238,-3.227714],[3.649524,4.592226,1.340021],[-3.354828,7.322425,-1.412086],[0.936449,6.209237,1.512693],[-1.001832,3.590411,-1.545892],[-3.770486,4.593242,2.477056],[-0.971925,0.067797,0.921384],[-4.639832,6.865407,2.311791],[-0.441014,8.093595,-0.595999],[-2.004852,6.37142,1.635383],[4.759591,1.92818,0.328328],[3.748064,1.224074,2.140484],[-0.703601,5.285476,2.251988],[0.59532,6.21893,0.981004],[0.980799,6.257026,1.24223],[1.574697,6.204981,0.381628],[1.149594,6.173608,1.660763],[-3.501963,5.895989,3.456576],[1.071122,5.424198,2.588717],[-0.774693,8.473335,-0.276957],[3.849959,4.15542,0.396742],[-0.801715,4.973149,-1.068582],[-2.927676,0.625112,2.326393],[2.669682,4.045542,2.971184],[-4.391324,4.74086,0.343463],[1.520129,6.270031,0.775471],[1.837586,6.084731,0.109188],[1.271475,5.975024,2.032355],[-3.487968,4.513249,2.605871],[-1.32234,1.517264,-0.691879],[-1.080301,1.648226,-0.805526],[-3.365703,6.910166,-0.454902],[1.36034,0.432238,3.075004],[-3.305013,5.774685,3.39142],[3.88432,0.654141,0.12574],[3.57254,0.377934,0.302501],[4.196136,0.807999,0.212229],[3.932997,0.543123,0.380579],[4.023704,3.286125,0.537597],[1.864455,4.916544,2.691677],[-4.775427,6.499498,1.440153],[-3.464928,3.68234,2.766356],[3.648972,1.751262,2.157485],[1.179111,3.238846,3.774796],[-0.171164,0.299126,-0.592669],[-4.502912,3.316656,0.875188],[-0.948454,9.214025,-0.679508],[1.237665,6.288593,1.046],[1.523423,6.268963,1.139544],[1.436519,6.140608,1.739316],[3.723607,1.504355,2.136762],[2.009495,4.045514,3.22053],[-1.921944,7.249905,0.213973],[1.254068,1.205518,3.474709],[-0.317087,5.996269,0.525872],[-2.996914,3.934607,2.900178],[-3.316873,4.028154,2.785696],[-3.400267,4.280157,2.689268],[-3.134842,4.564875,2.697192],[1.480563,4.692567,2.834068],[0.873682,1.315452,3.541585],[1.599355,0.91622,3.246769],[-3.292102,7.125914,2.768515],[3.74296,4.511299,0.616539],[4.698935,1.55336,0.26921],[-3.274387,3.299421,2.823946],[-2.88809,3.410699,2.955248],[1.171407,1.76905,3.688472],[1.430276,3.92483,3.473666],[3.916941,2.553308,0.018941],[0.701632,2.442372,3.778639],[1.562657,2.302778,3.660957],[4.476622,1.152407,0.182131],[-0.61136,5.761367,1.598838],[-3.102154,3.691687,2.903738],[1.816012,5.546167,2.380308],[3.853928,4.25066,0.750017],[1.234681,3.581665,3.673723],[1.862271,1.361863,3.355209],[1.346844,4.146995,3.327877],[1.70672,4.080043,3.274307],[0.897242,1.908983,3.6969],[-0.587022,9.191132,-0.565301],[-0.217426,5.674606,2.019968],[0.278925,6.120777,0.485403],[1.463328,3.578742,-2.001464],[-3.072985,4.264581,2.789502],[3.62353,4.673843,0.383452],[-3.053491,8.752377,-2.908434],[-2.628687,4.505072,2.755601],[0.891047,5.113781,2.748272],[-2.923732,3.06515,2.866368],[0.848008,4.754252,2.896972],[-3.319184,8.811641,-2.327412],[0.12864,8.814781,-1.334456],[1.549501,4.549331,-1.28243],[1.647161,3.738973,3.507719],[1.250888,0.945599,3.348739],[3.809662,4.038822,0.053142],[1.483166,0.673327,3.09156],[0.829726,3.635921,3.713103],[1.352914,5.226651,2.668113],[2.237352,4.37414,3.016386],[4.507929,0.889447,0.744249],[4.57304,1.010981,0.496588],[3.931422,1.720989,2.088175],[-0.463177,5.989835,0.834346],[-2.811236,3.745023,2.969587],[-2.805135,4.219721,2.841108],[-2.836842,4.802543,2.60826],[1.776716,2.084611,3.568638],[4.046881,1.463478,2.106273],[0.316265,5.944313,1.892785],[-2.86347,2.776049,2.77242],[-2.673644,3.116508,2.907104],[-2.621149,4.018502,2.903409],[-2.573447,5.198013,2.477481],[1.104039,2.278985,3.722469],[-4.602743,4.306413,0.902296],[-2.684878,1.510731,0.535039],[0.092036,8.473269,-0.99413],[-1.280472,5.602393,1.928105],[-1.0279,4.121582,-1.403103],[-2.461081,3.304477,2.957317],[-2.375929,3.659383,2.953233],[1.417579,2.715389,3.718767],[0.819727,2.948823,3.810639],[1.329962,0.761779,3.203724],[1.73952,5.295229,2.537725],[0.952523,3.945016,3.548229],[-2.569498,0.633669,2.84818],[-2.276676,0.757013,2.780717],[-2.013147,7.354429,-0.003202],[0.93143,1.565913,3.600325],[1.249014,1.550556,3.585842],[2.287252,4.072353,3.124544],[-4.7349,7.006244,1.690653],[-3.500602,8.80386,-2.009196],[-0.582629,5.549138,2.000923],[-1.865297,6.356066,1.313593],[-3.212154,2.376143,-0.565593],[2.092889,3.493536,-1.727931],[-2.528501,2.784531,2.833758],[-2.565697,4.893154,2.559605],[-2.153366,5.04584,2.465215],[1.631311,2.568241,3.681445],[2.150193,4.699227,2.807505],[0.507599,5.01813,2.775892],[4.129862,1.863698,2.015101],[3.578279,4.50766,-0.009598],[3.491023,4.806749,1.549265],[0.619485,1.625336,3.605125],[1.107499,2.932557,3.790061],[-2.082292,6.99321,0.742601],[4.839909,1.379279,0.945274],[3.591328,4.322645,-0.259497],[1.055245,0.710686,3.16553],[-3.026494,7.842227,1.624553],[0.146569,6.119214,0.981673],[-2.043687,2.614509,2.785526],[-2.302242,3.047775,2.936355],[-2.245686,4.100424,2.87794],[2.116148,5.063507,2.572204],[-1.448406,7.64559,0.251692],[2.550717,4.9268,2.517526],[-2.955456,7.80293,-1.782407],[1.882995,4.637167,2.895436],[-2.014924,3.398262,2.954896],[-2.273654,4.771227,2.611418],[-2.162723,7.876761,0.702473],[-0.198659,5.823062,1.739272],[-1.280908,2.133189,-0.921241],[2.039932,4.251568,3.136579],[1.477815,4.354333,3.108325],[0.560504,3.744128,3.6913],[-2.234018,1.054373,2.352782],[-3.189156,7.686661,-2.514955],[-3.744736,7.69963,2.116973],[-2.283366,2.878365,2.87882],[-2.153786,4.457481,2.743529],[4.933978,1.677287,0.713773],[3.502146,0.535336,1.752511],[1.825169,4.419253,3.081198],[3.072331,0.280979,0.106534],[-0.508381,1.220392,2.878049],[-3.138824,8.445394,-1.659711],[-2.056425,2.954815,2.897241],[-2.035343,5.398477,2.215842],[-3.239915,7.126798,-0.712547],[-1.867923,7.989805,0.526518],[1.23405,6.248973,1.387189],[-0.216492,8.320933,-0.862495],[-2.079659,3.755709,2.928563],[-1.78595,4.300374,2.805295],[-1.856589,5.10678,2.386572],[-1.714362,5.544778,2.004623],[1.722403,4.200291,-1.408161],[0.195386,0.086928,-1.318006],[1.393693,3.013404,3.710686],[-0.415307,8.508471,-0.996883],[-1.853777,0.755635,2.757275],[-1.724057,3.64533,2.884251],[-1.884511,4.927802,2.530885],[-1.017174,7.783908,-0.227078],[-1.7798,2.342513,2.741749],[-1.841329,3.943996,2.88436],[1.430388,5.468067,2.503467],[-2.030296,0.940028,2.611088],[-1.677028,1.215666,2.607771],[-1.74092,2.832564,2.827295],[4.144673,0.631374,0.503358],[4.238811,0.653992,0.762436],[-1.847016,2.082815,2.642674],[4.045764,3.194073,0.852117],[-1.563989,8.112739,0.303102],[-1.781627,1.794836,2.602338],[-1.493749,2.533799,2.797251],[-1.934496,4.690689,2.658999],[-1.499174,5.777946,1.747498],[-2.387409,0.851291,1.500524],[-1.872211,8.269987,0.392533],[-4.647726,6.765771,0.833653],[-3.157482,0.341958,-0.20671],[-1.725766,3.24703,2.883579],[-1.458199,4.079031,2.836325],[-1.621548,4.515869,2.719266],[-1.607292,4.918914,2.505881],[-1.494661,5.556239,1.991599],[-1.727269,7.423769,0.012337],[-1.382497,1.161322,2.640222],[-1.52129,4.681714,2.615467],[-4.247127,2.792812,1.250843],[-1.576338,0.742947,2.769799],[-1.499257,2.172763,2.743142],[-1.480392,3.103261,2.862262],[1.049137,2.625836,3.775384],[-1.368063,1.791587,2.695516],[-1.307839,2.344534,2.767575],[-1.336758,5.092221,2.355225],[-1.5617,5.301749,2.21625],[-1.483362,8.537704,0.196752],[-1.517348,8.773614,0.074053],[-1.474302,1.492731,2.641433],[2.48718,0.644247,-0.920226],[0.818091,0.422682,3.171218],[-3.623398,6.930094,3.033045],[1.676333,3.531039,3.591591],[1.199939,5.683873,2.365623],[-1.223851,8.841201,0.025414],[-1.286307,3.847643,2.918044],[-1.25857,4.810831,2.543605],[2.603662,5.572146,1.991854],[0.138984,5.779724,2.077834],[-1.267039,3.175169,2.890889],[-1.293616,3.454612,2.911774],[-2.60112,1.277184,0.07724],[2.552779,3.649877,3.163643],[-1.038983,1.248011,2.605933],[-1.288709,4.390967,2.761214],[-1.034218,5.485963,2.011467],[-1.185576,1.464842,2.624335],[-1.045682,2.54896,2.761102],[4.259176,1.660627,2.018096],[-0.961707,1.717183,2.598342],[-1.044603,3.147464,2.855335],[-0.891998,4.685429,2.669696],[-1.027561,5.081672,2.377939],[4.386506,0.832434,0.510074],[-1.014225,9.064991,-0.175352],[-1.218752,2.895443,2.823785],[-0.972075,4.432669,2.788005],[-2.714986,0.52425,1.509798],[-0.699248,1.517219,2.645738],[-1.161581,2.078852,2.722795],[-0.845249,3.286247,2.996471],[1.068329,4.443444,2.993863],[3.98132,3.715557,1.027775],[1.658097,3.982428,-1.651688],[-4.053701,2.449888,0.734746],[-0.910935,2.214149,2.702393],[0.087824,3.96165,3.439344],[-0.779714,3.724134,2.993429],[-1.051093,3.810797,2.941957],[-0.644941,4.3859,2.870863],[-2.98403,8.666895,-3.691888],[-0.754304,2.508325,2.812999],[-4.635524,3.662891,0.913005],[-0.983299,4.125978,2.915378],[4.916497,1.905209,0.621315],[4.874983,1.728429,0.468521],[2.33127,5.181957,2.441697],[-0.653711,2.253387,2.7949],[-3.623744,8.978795,-2.46192],[-4.555927,6.160279,0.215755],[-4.940628,5.806712,1.18383],[3.308506,2.40326,-0.910776],[0.58835,5.251928,-0.992886],[2.152215,5.449733,2.331679],[-0.712755,0.766765,3.280375],[-0.741771,1.9716,2.657235],[-4.828957,5.566946,2.635623],[-3.474788,8.696771,-1.776121],[1.770417,6.205561,1.331627],[-0.620626,4.064721,2.968972],[-1.499187,2.307735,-0.978901],[4.098793,2.330245,1.667951],[1.940444,6.167057,0.935904],[-2.314436,1.104995,1.681277],[-2.733629,7.742793,1.7705],[-0.452248,4.719868,2.740834],[-0.649143,4.951713,2.541296],[-0.479417,9.43959,-0.676324],[-2.251853,6.559275,0.046819],[0.033531,8.316907,-0.789939],[-0.513125,0.995673,3.125462],[-2.637602,1.039747,0.602434],[1.527513,6.230089,1.430903],[4.036124,2.609846,1.506498],[-3.559828,7.877892,1.228076],[-4.570736,4.960193,0.838201],[-0.432121,5.157731,2.467518],[-1.206735,4.562511,-1.237054],[-0.823768,3.788746,-1.567481],[-3.095544,7.353613,-1.024577],[-4.056088,7.631119,2.062001],[-0.289385,5.382261,2.329421],[1.69752,6.136483,1.667037],[-0.168758,5.061138,2.617453],[2.853576,1.605528,-1.229958],[-4.514319,6.586675,0.352756],[-2.558081,7.741151,1.29295],[1.61116,5.92358,2.071534],[3.936921,3.354857,0.091755],[-0.1633,1.119272,3.147975],[0.067551,1.593475,3.38212],[-1.303239,2.328184,-1.011672],[-0.438093,0.73423,3.398384],[-4.62767,3.898187,0.849573],[0.286853,4.165281,3.284834],[-2.968052,8.492812,-3.493693],[-0.111896,3.696111,3.53791],[-3.808245,8.451731,-1.574742],[0.053416,5.558764,2.31107],[3.956269,3.012071,0.11121],[-0.710956,8.106561,-0.665154],[0.234725,2.717326,3.722379],[-0.031594,2.76411,3.657347],[-0.017371,4.700633,2.81911],[0.215064,5.034859,2.721426],[-0.111151,8.480333,-0.649399],[3.97942,3.575478,0.362219],[0.392962,4.735392,2.874321],[4.17015,2.085087,1.865999],[0.169054,1.244786,3.337709],[0.020049,3.165818,3.721736],[0.248212,3.595518,3.698376],[0.130706,5.295541,2.540034],[-4.541357,4.798332,1.026866],[-1.277485,1.289518,-0.667272],[3.892133,3.54263,-0.078056],[4.057379,3.03669,0.997913],[0.287719,0.884758,3.251787],[0.535771,1.144701,3.400096],[0.585303,1.399362,3.505353],[0.191551,2.076246,3.549355],[0.328656,2.394576,3.649623],[0.413124,3.240728,3.771515],[0.630361,4.501549,2.963623],[0.529441,5.854392,2.120225],[3.805796,3.769958,-0.162079],[3.447279,4.344846,-0.467276],[0.377618,5.551116,2.426017],[0.409355,1.821269,3.606333],[0.719959,2.194726,3.703851],[0.495922,3.501519,3.755661],[0.603408,5.354097,2.603088],[-4.605056,7.531978,1.19579],[0.907972,0.973128,3.356513],[0.750134,3.356137,3.765847],[0.4496,3.993244,3.504544],[-3.030738,7.48947,-1.259169],[0.707505,5.602005,2.43476],[0.668944,0.654891,3.213797],[0.593244,2.700978,3.791427],[1.467759,3.30327,3.71035],[3.316249,2.436388,2.581175],[3.26138,1.724425,2.539028],[-1.231292,7.968263,0.281414],[-0.108773,8.712307,-0.790607],[4.445684,1.819442,1.896988],[1.998959,2.281499,3.49447],[2.162269,2.113817,3.365449],[4.363397,1.406731,1.922714],[4.808,2.225842,0.611127],[2.735919,0.771812,-0.701142],[1.897735,2.878428,3.583482],[-3.31616,5.331985,3.212394],[-3.3314,6.018137,3.313018],[-3.503183,6.480103,3.222216],[-1.904453,5.750392,1.913324],[-1.339735,3.559592,-1.421817],[-1.044242,8.22539,0.037414],[1.643492,3.110676,3.647424],[3.992832,3.686244,0.710946],[1.774207,1.71842,3.475768],[-3.438842,5.5713,3.427818],[4.602447,1.2583,1.619528],[-0.925516,7.930042,0.072336],[-1.252093,3.846565,-1.420761],[-3.426857,5.072419,2.97806],[-3.160408,6.152629,3.061869],[3.739931,3.367082,2.041273],[1.027419,4.235891,3.251253],[4.777703,1.887452,1.560409],[-3.318528,6.733796,2.982968],[2.929265,4.962579,2.271079],[3.449761,2.838629,2.474576],[-3.280159,5.029875,2.787514],[4.068939,2.993629,0.741567],[0.303312,8.70927,-1.121972],[0.229852,8.981322,-1.186075],[-0.011045,9.148156,-1.047057],[-2.942683,5.579613,2.929297],[-3.145409,5.698727,3.205778],[-3.019089,6.30887,2.794323],[-3.217135,6.468191,2.970032],[-3.048298,6.993641,2.623378],[-3.07429,6.660982,2.702434],[3.612011,2.5574,2.25349],[2.54516,4.553967,2.75884],[-1.683759,7.400787,0.250868],[-1.756066,7.463557,0.448031],[-3.023761,5.149697,2.673539],[3.112376,2.677218,2.782378],[2.835327,4.581196,2.567146],[-2.973799,7.225458,2.506988],[-0.591645,8.740662,-0.505845],[3.782861,2.04337,2.03066],[3.331604,3.36343,2.605047],[2.966866,1.205497,2.537432],[0.002669,9.654748,-1.355559],[2.632801,0.58497,2.540311],[-2.819398,5.087372,2.521098],[2.616193,5.332961,2.194288],[-3.193973,4.925634,2.607924],[-3.12618,5.27524,2.944544],[-0.426003,8.516354,-0.501528],[2.802717,1.387643,2.751649],[-3.120597,7.889111,-2.75431],[2.636648,1.71702,2.991302],[-2.853151,6.711792,2.430276],[-2.843836,6.962865,2.400842],[1.9696,3.199023,3.504514],[-2.461751,0.386352,3.008994],[1.64127,0.495758,3.02958],[-4.330472,5.409831,0.025287],[-2.912387,5.980416,2.844261],[-2.490069,0.211078,2.985391],[3.581816,4.809118,0.733728],[2.693199,2.647213,3.126709],[-0.182964,8.184108,-0.638459],[-2.226855,0.444711,2.946552],[-0.720175,8.115055,0.017689],[2.645302,4.316212,2.850139],[-0.232764,9.329503,-0.918639],[4.852365,1.471901,0.65275],[2.76229,2.014994,2.957755],[-2.808374,5.354301,2.644695],[-2.790967,6.406963,2.547985],[-1.342684,0.418488,-1.669183],[2.690675,5.593587,-0.041236],[4.660146,1.6318,1.713314],[2.775667,3.007229,3.111332],[-0.396696,8.963432,-0.706202],[2.446707,2.740617,3.321433],[-4.803209,5.884634,2.603672],[-2.652003,1.6541,1.5078],[3.932327,3.972874,0.831924],[2.135906,0.955587,2.986608],[2.486131,2.053802,3.124115],[-0.386706,8.115753,-0.37565],[-2.720727,7.325044,2.224878],[-1.396946,7.638016,-0.16486],[-0.62083,7.989771,-0.144413],[-2.653272,5.729684,2.667679],[3.038188,4.65835,2.364142],[2.381721,0.739472,2.788992],[-2.345829,5.474929,2.380633],[-2.518983,6.080562,2.479383],[-2.615793,6.839622,2.186116],[-2.286566,0.143752,2.766848],[-4.771219,6.508766,1.070797],[3.717308,2.905019,2.097994],[2.50521,3.016743,3.295898],[2.208448,1.56029,3.216806],[3.346783,1.01254,2.119951],[2.653503,3.26122,3.175738],[-2.359636,5.827519,2.402297],[-1.952693,0.558102,2.853307],[-0.321562,9.414885,-1.187501],[3.138923,1.405072,2.520765],[1.493728,1.780051,3.621969],[3.01817,0.907291,2.336909],[3.183548,1.185297,2.352175],[1.608619,5.006753,2.695131],[-4.723919,6.836107,1.095288],[-1.017586,8.865429,-0.149328],[4.730762,1.214014,0.64008],[-2.135182,6.647907,1.495471],[-2.420382,6.546114,2.108209],[-2.458053,7.186346,1.896623],[3.437124,0.275798,1.138203],[0.095925,8.725832,-0.926481],[2.417376,2.429869,3.287659],[2.279951,1.200317,3.049994],[2.674753,2.326926,3.044059],[-2.328123,6.849164,1.75751],[-3.418616,7.853407,0.126248],[-3.151587,7.77543,-0.110889],[2.349144,5.653242,2.05869],[-2.273236,6.085631,2.242888],[-4.560601,4.525342,1.261241],[2.866334,3.796067,2.934717],[-2.17493,6.505518,1.791367],[3.12059,3.283157,2.818869],[3.037703,3.562356,2.866653],[0.066233,9.488418,-1.248237],[2.749941,0.975018,2.573371],[-2.155749,5.801033,2.204009],[-2.162778,6.261889,2.028596],[1.936874,0.459142,2.956718],[3.176249,4.335541,2.440447],[4.356599,1.029423,1.700589],[3.873502,3.082678,1.80431],[2.895489,4.243034,2.735259],[-0.095774,9.468195,-1.07451],[-1.124982,7.886808,-0.480851],[3.032304,3.065454,2.897927],[3.692687,4.5961,0.957858],[-3.013045,3.807235,-1.098381],[-0.790012,8.92912,-0.367572],[1.905793,0.73179,2.996728],[3.530396,3.426233,2.356583],[2.12299,0.624933,2.929167],[-2.069196,6.039284,2.01251],[-3.565623,7.182525,2.850039],[2.959264,2.376337,2.829242],[2.949071,1.822483,2.793933],[4.036142,0.763803,1.703744],[-1.993527,6.180318,1.804936],[-0.030987,0.766389,3.344766],[-0.549683,8.225193,-0.189341],[-0.765469,8.272246,-0.127174],[-2.947047,7.541648,-0.414113],[-3.050327,9.10114,-3.435619],[3.488566,2.231807,2.399836],[3.352283,4.727851,1.946438],[4.741011,2.162773,1.499574],[-1.815093,6.072079,1.580722],[-3.720969,8.267927,-0.984713],[1.932826,3.714052,3.427488],[3.323617,4.438961,2.20732],[0.254111,9.26364,-1.373244],[-1.493384,7.868585,-0.450051],[-0.841901,0.776135,-1.619467],[0.243537,6.027668,0.091687],[0.303057,0.313022,-0.531105],[-0.435273,0.474098,3.481552],[2.121507,2.622389,3.486293],[1.96194,1.101753,3.159584],[3.937991,3.407551,1.551392],[0.070906,0.295753,1.377185],[-1.93588,7.631764,0.651674],[-2.523531,0.744818,-0.30985],[2.891496,3.319875,2.983079],[4.781765,1.547061,1.523129],[-2.256064,7.571251,0.973716],[3.244861,3.058249,2.724392],[-0.145855,0.437775,3.433662],[1.586296,5.658538,2.358487],[3.658336,3.774921,2.071837],[2.840463,4.817098,2.46376],[-1.219464,8.122542,-0.672808],[-2.520906,2.664486,-1.034346],[-1.315417,8.471365,-0.709557],[3.429165,3.74686,2.446169],[3.074579,3.840758,2.767409],[3.569443,3.166337,2.333647],[2.294337,3.280051,3.359346],[2.21816,3.66578,3.269222],[2.158662,4.151444,-1.357919],[1.13862,4.380986,-1.404565],[3.388382,2.749931,-0.840949],[3.059892,5.084848,2.026066],[3.204739,2.075145,2.640706],[3.387065,1.42617,2.305275],[3.910398,2.670742,1.750179],[3.471512,1.945821,2.395881],[4.08082,1.070654,1.960171],[-1.057861,0.133036,2.146707],[-0.151749,5.53551,-0.624323],[3.233099,4.003778,2.571172],[2.611726,5.319199,-0.499388],[2.682909,1.094499,-1.206247],[-1.22823,7.656887,0.041409],[-2.293247,7.259189,0.013844],[0.081315,0.202174,3.286381],[-1.002038,5.794454,-0.187194],[3.448856,4.08091,2.258325],[0.287883,9.006888,-1.550641],[-3.851019,4.059839,-0.646922],[3.610966,4.205438,1.913129],[2.239042,2.950872,3.449959],[0.216305,0.442843,3.328052],[1.87141,2.470745,3.574559],[3.811378,2.768718,-0.228364],[2.511081,1.362724,2.969349],[-1.59813,7.866506,0.440184],[-3.307975,2.851072,-0.894978],[-0.107011,8.90573,-0.884399],[-3.855315,2.842597,-0.434541],[2.517853,1.090768,2.799687],[3.791709,2.36685,2.002703],[4.06294,2.773922,0.452723],[-2.973289,7.61703,-0.623653],[-2.95509,8.924462,-3.446319],[2.861402,0.562592,2.184397],[-1.109725,8.594206,-0.076812],[-0.725722,7.924485,-0.381133],[-1.485587,1.329994,-0.654405],[-4.342113,3.233735,1.752922],[-2.968049,7.955519,-2.09405],[-3.130948,0.446196,0.85287],[-4.958475,5.757329,1.447055],[-3.086547,7.615193,-1.953168],[-3.751923,5.412821,3.373373],[-4.599645,7.480953,1.677134],[1.133992,0.274871,0.032249],[-2.956512,8.126905,-1.785461],[-0.960645,4.73065,-1.191786],[-2.871064,0.875559,0.424881],[-4.932114,5.99614,1.483845],[-2.981761,8.124612,-1.387276],[0.362298,8.978545,-1.368024],[-4.408375,3.046271,0.602373],[2.865841,2.322263,-1.344625],[-4.7848,5.620895,0.594432],[-2.88322,0.338931,1.67231],[-4.688101,6.772931,1.872318],[-4.903948,6.164698,1.27135],[2.85663,1.005647,-0.906843],[2.691286,0.209811,0.050512],[-4.693636,6.477556,0.665796],[-4.472331,6.861067,0.477318],[0.883065,0.204907,3.073933],[-0.995867,8.048729,-0.653897],[-0.794663,5.670397,-0.390119],[3.313153,1.638006,-0.722289],[-4.856459,5.394758,1.032591],[-3.005448,7.783023,-0.819641],[3.11891,2.036974,-1.08689],[-2.364319,2.408419,2.63419],[-2.927132,8.75435,-3.537159],[-3.296222,7.964629,-3.134625],[-1.642041,4.13417,-1.301665],[2.030759,0.176372,-1.030923],[-4.559069,3.751053,0.548453],[3.438385,4.59454,-0.243215],[-2.561769,7.93935,0.177696],[2.990593,1.335314,-0.943177],[1.2808,0.276396,-0.49072],[-0.318889,0.290684,0.211143],[3.54614,3.342635,-0.767878],[-3.073372,7.780018,-2.357807],[-4.455388,4.387245,0.361038],[-4.659393,6.276064,2.767014],[0.636799,4.482223,-1.426284],[-2.987681,8.072969,-2.45245],[-2.610445,0.763554,1.792054],[3.358241,2.006707,-0.802973],[-0.498347,0.251594,0.962885],[3.1322,0.683312,2.038777],[-4.389801,7.493776,0.690247],[0.431467,4.22119,-1.614215],[-4.376181,3.213141,0.273255],[-4.872319,5.715645,0.829714],[-4.826893,6.195334,0.849912],[3.516562,2.23732,-0.677597],[3.131656,1.698841,-0.975761],[-4.754925,5.411666,1.989303],[-2.987299,7.320765,-0.629479],[-3.757635,3.274862,-0.744022],[3.487044,2.541999,-0.699933],[-4.53274,4.649505,0.77093],[-1.424192,0.099423,2.633327],[3.090867,2.476975,-1.146957],[-2.713256,0.815622,2.17311],[3.348121,3.254167,-0.984896],[-3.031379,0.16453,-0.309937],[-0.949757,4.518137,-1.309172],[-0.889509,0.095256,1.288803],[3.539594,1.966105,-0.553965],[-4.60612,7.127749,0.811958],[-2.332953,1.444713,1.624548],[3.136293,2.95805,-1.138272],[3.540808,3.069058,-0.735285],[3.678852,2.362375,-0.452543],[-4.648898,7.37438,0.954791],[-0.646871,0.19037,3.344746],[2.2825,0.29343,-0.826273],[-4.422291,7.183959,0.557517],[-4.694668,5.246103,2.541768],[-4.583691,4.145486,0.600207],[-2.934854,7.912513,-1.539269],[-3.067861,7.817472,-0.546501],[3.825095,3.229512,-0.237547],[2.532494,0.323059,2.387105],[-2.514583,0.692857,1.23597],[-4.736805,7.214384,1.259421],[-2.98071,8.409903,-2.468199],[2.621468,1.385844,-1.406355],[3.811447,3.560855,1.847828],[3.432925,1.497205,-0.489784],[3.746609,3.631538,-0.39067],[3.594909,2.832257,-0.576012],[-0.404192,5.300188,-0.856561],[-4.762996,6.483774,1.702648],[-4.756612,6.786223,1.43682],[-2.965309,8.437217,-2.785495],[2.863867,0.74087,-0.429684],[4.02503,2.968753,1.392419],[3.669036,1.833858,-0.304971],[-2.888864,0.720537,0.778057],[-2.36982,0.979443,1.054447],[-2.959259,8.222303,-2.659724],[-3.467825,7.545739,-2.333445],[2.153426,0.446256,-1.20523],[-3.229807,9.189699,-3.596609],[-3.72486,8.773707,-2.046671],[3.687218,3.297751,-0.523746],[1.381025,0.08815,-1.185668],[-2.796828,7.205622,-0.208783],[3.647194,4.066232,-0.291507],[-4.578376,3.885556,1.52546],[-2.840262,0.63094,1.89499],[-2.429514,0.922118,1.820781],[-4.675079,6.573925,2.423363],[2.806207,4.320188,-1.027372],[-1.289608,0.097241,1.321661],[-3.010731,8.141334,-2.866148],[3.202291,1.235617,-0.549025],[4.094792,2.477519,0.304581],[2.948403,0.966873,-0.664857],[-4.83297,5.920587,2.095461],[-2.169693,7.257277,0.946184],[-1.335807,3.057597,-1.303166],[-1.037877,0.64151,-1.685271],[2.627919,0.089814,0.439074],[3.815794,3.808102,1.730493],[-2.973455,8.433141,-3.08872],[-2.391558,7.331428,1.658264],[-4.333107,4.529978,1.850516],[-4.640293,3.767107,1.168841],[3.600716,4.46931,1.734024],[3.880803,1.730158,-0.172736],[3.814183,4.262372,1.167042],[4.37325,0.829542,1.413729],[2.490447,5.75111,0.011492],[3.460003,4.962436,1.188971],[3.918419,3.814234,1.358271],[-0.807595,8.840504,-0.953711],[3.752855,4.20577,1.57177],[-2.991085,8.816501,-3.244595],[-2.333196,7.128889,1.551985],[3.977718,3.570941,1.25937],[4.360071,0.755579,1.079916],[4.637579,1.027973,1.032567],[-2.317,7.421066,1.329589],[-1.013404,8.293662,-0.7823],[4.548023,1.020644,1.420462],[4.763258,1.266798,1.296203],[4.896,2.073084,1.255213],[4.015005,3.325226,1.093879],[4.94885,1.860936,0.894463],[-2.189645,6.954634,1.270077],[4.887442,1.720992,1.288526],[-3.184068,7.871802,0.956189],[-1.274318,0.839887,-1.224389],[-2.919521,7.84432,0.541629],[-2.994586,7.766102,1.96867],[-3.417504,9.241714,-3.093201],[-3.174563,7.466456,2.473617],[-3.263067,9.069412,-3.003459],[-2.841592,0.529833,2.693434],[-3.611069,9.158804,-2.829871],[-4.642828,5.927526,0.320549],[-3.809308,9.051035,-2.692749],[-2.837582,7.487987,-0.106206],[4.773025,2.330442,1.213899],[4.897435,2.209906,0.966657],[-3.067637,8.164062,-1.12661],[-3.122129,8.08074,-0.899194],[4.571019,2.358113,1.462054],[4.584884,2.454418,0.709466],[-3.661093,7.146581,-0.475948],[4.735131,2.415859,0.933939],[4.207556,2.540018,1.218293],[-3.607595,7.89161,-0.121172],[-1.527952,0.775564,-1.061903],[4.53874,2.503273,1.099583],[-3.938837,7.587988,0.082449],[-4.853582,6.152409,1.787943],[-4.752214,6.247234,2.296873],[4.602935,2.363955,0.488901],[-1.81638,6.365879,0.868272],[0.595467,4.744074,-1.32483],[1.87635,3.511986,-1.842924],[4.330947,2.534326,0.720503],[4.108736,2.750805,0.904552],[-1.890939,8.492628,-0.290768],[-3.504309,6.173058,-0.422804],[-1.611992,6.196732,0.648736],[-3.899149,7.826123,1.088845],[-3.078303,3.008813,-1.035784],[-2.798999,7.844899,1.340061],[-1.248839,5.959105,0.041761],[0.767779,4.337318,3.090817],[-3.831177,7.515605,2.432261],[-1.667528,6.156208,0.365267],[-1.726078,6.237384,1.100059],[-3.972037,4.520832,-0.370756],[-4.40449,7.636357,1.520425],[-1.34506,6.004054,1.293159],[-1.233556,6.049933,0.500651],[-3.696869,7.79732,0.37979],[-3.307798,8.949964,-2.698113],[-1.997295,6.615056,1.103691],[-3.219222,8.336394,-1.150614],[-3.452623,8.31866,-0.9417],[-3.94641,2.990494,2.212592],[-3.250025,8.030414,-0.596097],[-2.02375,1.571333,2.397939],[-3.190358,7.665013,2.268183],[-2.811918,7.618526,2.145587],[-1.005265,5.892303,0.072158],[-0.93721,5.974148,0.906669],[-4.646072,7.492193,1.45312],[-0.252931,1.797654,3.140638],[-1.076064,5.738433,1.695953],[-3.980534,7.744391,1.735791],[-0.721187,5.939396,0.526032],[-0.42818,5.919755,0.229001],[-1.43429,6.11622,0.93863],[-0.985638,5.939683,0.290636],[-4.433836,7.461372,1.966437],[-3.696398,7.844859,1.547325],[-3.390772,7.820186,1.812204],[-2.916787,7.864019,0.804341],[-3.715952,8.037269,-0.591341],[-4.204634,7.72919,1.119866],[-4.592233,5.592883,0.246264],[3.307299,5.061701,1.622917],[-3.515159,7.601467,2.368914],[-3.435742,8.533457,-1.37916],[-0.269421,4.545635,-1.366445],[-2.542124,3.768736,-1.258512],[-3.034003,7.873773,1.256854],[-2.801399,7.856028,1.080137],[3.29354,5.220894,1.081767],[-2.35109,1.299486,1.01206],[-3.232213,7.768136,2.047563],[3.290415,5.217525,0.68019],[-3.415109,7.731034,2.144326],[3.440357,4.962463,0.373387],[3.147346,5.352121,1.386923],[2.847252,5.469051,1.831981],[3.137682,5.410222,1.050188],[3.102694,5.310456,1.676434],[-3.044601,0.39515,1.994084],[2.903647,5.561338,1.518598],[-3.810148,8.093598,-0.889131],[4.234835,0.803054,1.593271],[3.240165,5.228747,0.325955],[3.037452,5.509825,0.817137],[2.635031,5.795187,1.439724],[3.071607,5.318303,0.080142],[2.909167,5.611751,1.155874],[3.044889,5.465928,0.486566],[2.502256,5.770673,1.740054],[-0.067497,0.086416,-1.190239],[2.33326,5.906051,0.138295],[0.65096,4.205423,3.308767],[-2.671137,7.936535,0.432731],[2.14463,5.879214,1.866047],[-4.776469,5.890689,0.561986],[2.72432,5.655145,0.211951],[2.730488,5.751455,0.695894],[2.572682,5.869295,1.152663],[1.906776,5.739123,2.196551],[2.344414,5.999961,0.772922],[-3.377905,7.448708,-1.863251],[2.285149,5.968156,1.459258],[2.385989,5.928974,0.3689],[2.192111,6.087516,0.959901],[2.36372,6.001101,1.074346],[1.972022,6.079603,1.591175],[1.87615,5.976698,1.91554],[-3.824761,9.05372,-2.928615],[2.044704,6.129704,1.263111],[-2.583046,0.849537,2.497344],[-0.078825,2.342205,3.520322],[-0.704686,0.537165,3.397194],[-0.257449,3.235334,3.647545],[-0.332064,1.448284,3.022583],[-2.200146,0.898284,-0.447212],[-2.497508,1.745446,1.829167],[0.30702,4.416315,2.978956],[-3.205197,3.479307,-1.040582],[0.110069,9.347725,-1.563686],[-0.82754,0.883886,3.065838],[-2.017103,1.244785,2.42512],[-0.421091,2.309929,3.153898],[-0.491604,3.796072,3.16245],[2.786955,3.501241,-1.340214],[-3.229055,4.380713,-0.899241],[3.730768,0.76845,1.90312],[-0.561079,2.652382,3.152463],[-3.461471,3.086496,2.662505],[-0.661405,3.446009,3.179939],[-0.915351,0.636755,3.243708],[-2.992964,8.915628,-3.729833],[-0.439627,3.502104,3.42665],[-1.154217,0.883181,2.800835],[-1.736193,1.465474,2.595489],[-0.423928,3.24435,3.548277],[-0.511153,2.871046,3.379749],[-0.675722,2.991756,3.143262],[-1.092602,0.599103,3.090639],[-0.89821,2.836952,2.840023],[-2.658412,0.781376,0.960575],[-2.271455,1.222857,1.330478],[-0.877861,1.111222,2.72263],[-0.306959,2.876987,3.556044],[-3.839274,7.84138,-0.918404],[-0.172094,4.083799,3.141708],[-1.548332,0.2529,2.864655],[-0.217353,4.873911,-1.223104],[-3.384242,3.181056,-0.95579],[-2.731704,0.382421,2.895502],[-1.285037,0.551267,2.947675],[0.077224,4.246579,3.066738],[-0.479979,1.77955,2.860011],[-0.716375,1.224694,2.666751],[-0.54622,3.138255,3.393457],[-2.33413,1.821222,2.124883],[-0.50653,2.037147,2.897465],[2.451291,1.211389,-1.466589],[-3.160047,2.894081,2.724286],[-4.137258,5.433431,3.21201],[0.462896,0.320456,-0.174837],[-0.37458,2.609447,3.379253],[-3.095244,0.256205,2.196446],[-4.197985,5.732991,3.262924],[-0.729747,0.246036,0.497036],[-2.356189,5.062,-0.965619],[-1.609036,0.25962,-1.487367],[-4.074381,6.074061,3.409459],[-3.619304,4.0022,2.65705],[-0.543393,8.742896,-1.056622],[-4.30356,6.858934,2.879642],[-0.716688,2.901831,-2.11202],[1.547362,0.083189,1.138764],[-0.250916,0.275268,1.201344],[-3.778035,3.13624,2.466177],[-4.594316,5.771342,3.01694],[-3.717706,3.442887,2.603344],[-4.311163,5.224669,3.019373],[-0.610389,2.095161,-1.923515],[-3.040086,6.196918,-0.429149],[-3.802695,3.768247,2.545523],[-0.159541,2.043362,3.328549],[-3.744329,4.31785,2.491889],[-3.047939,0.214155,1.873639],[-4.41685,6.113058,3.166774],[-1.165133,0.460692,-1.742134],[-1.371289,4.249996,-1.317935],[-3.447883,0.3521,0.466205],[-4.495555,6.465548,2.944147],[-3.455335,0.171653,0.390816],[-3.964028,4.017196,2.376009],[-1.323595,1.763126,-0.750772],[-3.971142,5.277524,-0.19496],[-3.222052,0.237723,0.872229],[-4.403784,3.89107,1.872077],[-3.333311,0.342997,0.661016],[-4.495871,4.29606,1.63608],[-3.636081,2.760711,2.361949],[-4.487235,3.559608,1.66737],[-4.719787,7.26888,1.658722],[-1.086143,9.035741,-0.707144],[-2.339693,1.600485,-0.404817],[-4.642011,7.123829,1.990987],[-1.498077,3.854035,-1.369787],[-4.188372,4.729363,2.02983],[-3.116344,5.882284,-0.468884],[-4.305236,4.246417,1.976991],[-3.022509,0.22819,1.065688],[-2.799916,0.52022,1.128319],[-4.262823,3.534409,2.020383],[-4.221533,3.947676,2.11735],[-3.744353,4.391712,-0.6193],[-1.272905,0.156694,-1.741753],[-3.62491,2.669825,-0.549664],[-4.180756,3.096179,1.987215],[-4.059276,4.305313,2.232924],[-2.812753,0.183226,1.370267],[-4.032437,3.512234,2.309985],[-0.03787,0.28188,0.530391],[-4.711562,5.468653,2.822838],[-4.500636,6.953314,2.564445],[-4.479433,7.216991,2.270682],[3.990562,0.50522,0.716309],[-2.512229,6.863447,-0.100658],[-2.968058,6.956639,-0.37061],[2.550375,3.142683,-1.54068],[-2.320059,3.521605,-1.279397],[-4.556319,6.64662,2.745363],[-4.281091,7.108116,2.667598],[-2.050095,8.411689,0.121353],[-2.44854,1.135487,0.851875],[3.121815,0.699943,-0.277167],[-4.69877,6.00376,2.843035],[-1.360599,8.824742,-0.595597],[1.128437,0.171611,0.301691],[-4.360146,6.289423,0.042233],[1.400795,4.088829,-1.620409],[-3.193462,8.460137,-3.559446],[-3.168771,8.878431,-3.635795],[-3.434275,9.304302,-3.460878],[-3.349993,8.808093,-3.38179],[-3.304823,8.323865,-3.325905],[-3.572607,9.308843,-3.207672],[-3.166393,8.201215,-3.43014],[-3.451638,9.05331,-3.351345],[-3.309591,8.549758,-3.375055],[-3.527992,8.793926,-3.100376],[-3.6287,8.981677,-3.076319],[-3.445505,8.001887,-2.8273],[-3.408011,8.221014,-3.039237],[-3.65928,8.740382,-2.808856],[-3.878019,8.797295,-2.462866],[-3.515132,8.232341,-2.747739],[-3.460331,8.51524,-3.06818],[-3.403703,7.658628,-2.648789],[-3.507113,8.00159,-2.582275],[-3.607373,8.174737,-2.401723],[-3.749043,8.378084,-2.226959],[-3.648514,8.502213,-2.6138],[-2.534199,0.904753,2.021148],[1.4083,5.744252,-0.571402],[-3.852536,8.571009,-2.352358],[2.868255,5.373126,-0.163705],[2.224363,4.669891,-1.061586],[-4.528281,4.885838,1.340274],[1.30817,4.609629,-1.28762],[-4.519698,3.422501,1.354826],[-3.549955,7.783228,-2.332859],[1.12313,6.120856,0.045115],[-3.620324,7.57716,-2.033423],[-0.798833,2.624133,-1.992682],[-3.617587,7.783148,-2.051383],[-3.669293,8.103776,-2.10227],[-3.892417,8.667436,-2.167288],[-0.537435,0.285345,-0.176267],[-0.841522,3.299866,-1.887861],[-0.761547,3.647082,-1.798953],[-3.661544,7.85708,-1.867924],[-3.886763,8.551783,-1.889171],[-0.591244,1.549749,-1.714784],[-0.775276,1.908218,-1.597609],[-0.961458,2.573273,-1.695549],[-2.215672,1.335009,2.143031],[-4.622674,4.130242,1.220683],[1.07344,0.290099,1.584734],[-0.976906,2.92171,-1.76667],[-1.13696,3.194401,-1.513455],[-3.743262,7.99949,-1.629286],[-2.876359,4.900986,-0.879556],[0.550835,3.905557,-2.031372],[0.777647,4.992314,-1.215703],[1.445881,4.266201,-1.414663],[1.274222,5.510543,-0.824495],[-0.864685,2.318581,-1.702389],[-0.627458,3.820722,-1.743153],[-3.867699,8.30866,-1.850066],[1.635287,5.45587,-0.83844],[-1.037876,2.538589,-1.513504],[-4.38993,4.73926,1.699639],[0.048709,4.765232,-1.279506],[-0.626548,1.339887,-1.595114],[-3.682827,7.643453,-1.723398],[-3.868783,8.180191,-1.511743],[-0.76988,1.508373,-1.419599],[-1.138374,2.766765,-1.448163],[1.699883,5.780752,-0.475361],[1.214305,0.308517,1.866405],[-1.713642,0.373461,-1.265204],[-1.582388,0.58294,-1.267977],[-0.879549,1.821581,-1.313787],[0.519057,5.858757,-0.381397],[-3.770989,2.449208,-0.132655],[0.087576,0.156713,-1.53616],[-0.942622,2.146534,-1.421494],[-1.026192,1.022164,-1.145423],[-0.964079,1.645473,-1.067631],[-1.109128,2.458789,-1.29106],[-1.037478,0.209489,-1.805424],[-3.724391,7.599686,-1.273458],[-3.787898,7.951792,-1.304794],[3.821677,2.165581,-0.181535],[-2.39467,0.304606,-0.570375],[-2.352928,1.0439,2.079369],[-0.288899,9.640684,-1.006079],[-3.472118,7.263001,-1.080326],[-1.240769,0.972352,-0.976446],[-1.845253,0.356801,-0.995574],[-2.32279,7.915361,-0.057477],[-1.08092,2.179315,-1.168821],[4.598833,2.156768,0.280264],[-4.725417,6.442373,2.056809],[-0.490347,9.46429,-0.981092],[-1.99652,0.09737,-0.765828],[-1.137793,1.888846,-0.894165],[-0.37247,4.29661,-1.465199],[-0.184631,5.692946,-0.421398],[-3.751694,7.742231,-1.086908],[-1.001416,1.298225,-0.904674],[-3.536884,7.190777,-0.788609],[-3.737597,7.511281,-0.940052],[-1.766651,0.669388,-0.873054],[3.112245,3.474345,-1.129672],[-0.175504,3.81298,-2.0479],[-3.766762,7.412514,-0.681569],[-0.63375,9.439424,-0.785128],[-0.518199,4.768982,-1.258625],[0.790619,4.212759,-1.610218],[-3.761951,3.742528,-0.756283],[0.897483,5.679808,-0.612423],[2.221126,4.427468,-1.252155],[-0.728577,5.846457,0.062702],[0.194451,9.503908,-1.482461],[-0.099243,9.385459,-1.39564],[0.643185,3.636855,-2.180247],[0.894522,5.900601,-0.356935],[2.595516,4.75731,-0.893245],[1.108497,3.936893,-1.905098],[1.989894,5.789726,-0.343268],[-3.802345,7.655508,-0.613817],[2.339353,4.96257,-0.90308],[0.12564,4.013324,-1.879236],[-4.078965,3.683254,-0.445439],[2.092899,5.256128,-0.831607],[0.427571,0.291769,1.272964],[2.335549,3.480056,-1.581949],[-0.15687,0.324827,-1.648922],[-0.536522,5.760786,-0.203535],[1.507082,0.078251,-0.923109],[-1.854742,0.134826,2.698774],[-3.939827,3.168498,-0.526144],[-3.98461,3.39869,-0.533212],[-3.961738,4.217132,-0.489147],[4.273789,2.181164,0.153786],[-0.470498,5.645664,-0.439079],[-0.414539,5.488017,-0.673379],[-0.097462,5.062739,-1.114863],[1.198092,5.882232,-0.391699],[2.855834,5.085022,-0.498678],[1.037998,4.129757,-1.701811],[1.728091,5.068444,-1.063761],[-3.832258,2.625141,-0.311384],[-4.078526,3.070256,-0.284362],[-4.080365,3.954243,-0.440471],[-0.152578,5.276267,-0.929815],[-1.489635,8.928082,-0.295891],[0.759294,5.15585,-1.087374],[-4.000338,2.801647,-0.235135],[-4.290801,3.823209,-0.19374],[-4.221493,4.25618,-0.189894],[-4.066195,4.71916,-0.201724],[-0.155386,4.076396,-1.662865],[3.054571,4.414305,-0.825985],[-1.652919,8.726499,-0.388504],[-3.042753,0.560068,-0.126425],[-2.434456,1.118088,-0.213563],[-2.623502,1.845062,-0.283697],[-4.233371,3.43941,-0.202918],[2.726702,3.82071,-1.280097],[0.184199,4.14639,-1.673653],[-1.289203,0.624562,-1.560929],[-3.823676,7.382458,-0.407223],[0.476667,5.064419,-1.143742],[-3.873651,4.955112,-0.269389],[1.349666,5.312227,-1.000274],[-2.043776,8.434488,-0.108891],[-2.763964,0.733395,-0.129294],[-4.380505,3.664409,-0.024546],[-0.71211,5.341811,-0.803281],[-3.960858,7.183112,-0.118407],[-3.822277,7.712853,-0.263221],[-2.346808,8.108588,0.063244],[-1.841731,8.642999,-0.142496],[-2.600055,0.985604,-0.043595],[-3.513057,2.213243,-0.044151],[-3.963492,2.603055,-0.080898],[-4.258066,3.14537,-0.027046],[-4.261572,5.00334,0.13004],[0.795464,3.99873,-1.905688],[-3.300873,0.384761,0.013271],[-2.770244,0.881942,0.077313],[-3.456227,1.993871,0.301054],[-4.441987,3.914144,0.177867],[-4.367075,6.611414,0.165312],[-3.201767,0.576292,0.105769],[-3.174354,0.645009,0.440373],[-2.996576,0.74262,0.161325],[-2.724979,1.656497,0.092983],[-3.261757,2.017742,-0.070763],[-4.280173,4.518235,-0.002999],[-4.471073,5.945358,0.05202],[-3.877137,2.40743,0.274928],[-4.371219,4.252758,0.078039],[-3.400914,0.40983,0.238599],[-4.44293,3.523242,0.146339],[-4.574528,5.279761,0.353923],[-4.226643,7.191282,0.269256],[-4.16361,2.843204,0.097727],[-4.528506,5.011661,0.536625],[0.35514,5.664802,-0.572814],[2.508711,5.580976,-0.266636],[2.556226,3.633779,-1.426362],[1.878456,4.533714,-1.223744],[2.460709,4.440241,-1.1395],[2.218589,5.514603,-0.560066],[2.263712,5.737023,-0.250694],[2.964981,3.814858,-1.139927],[0.991384,5.304131,-0.999867],[2.81187,4.547292,-0.916025],[2.918089,4.768382,-0.702808],[3.262403,4.414286,-0.657935],[0.652136,6.089113,0.069089],[3.361389,3.5052,-0.946123],[2.613042,5.037192,-0.697153],[0.094339,4.36858,-1.451238],[3.290862,4.155716,-0.732318],[2.658063,4.073614,-1.217455],[3.260349,3.753257,-0.946819],[1.124268,4.862463,-1.207855],[3.35158,4.899247,-0.027586],[3.194057,4.691257,-0.524566],[3.090119,5.116085,-0.23255],[2.418965,3.811753,-1.419399],[2.191789,3.877038,-1.47023],[4.043166,2.034188,0.015477],[-1.026966,0.86766,-1.410912],[1.937563,3.860005,-1.617465],[2.98904,4.101806,-0.998132],[-0.142611,5.865305,-0.100872],[3.972673,2.292069,0.089463],[3.23349,3.959925,-0.849829],[0.16304,5.857276,-0.216704],[4.122964,1.770061,-0.114906],[2.099057,4.978374,-0.98449],[3.502411,3.76181,-0.667502],[2.079484,5.939614,-0.036205],[-0.084568,3.525193,-2.253506],[0.423859,4.06095,-1.845327],[1.6013,6.006466,-0.153429],[0.271701,3.844964,-2.078748],[0.273577,5.218904,-0.994711],[-0.410578,3.92165,-1.773635],[1.941954,5.60041,-0.621569],[0.100825,5.462131,-0.774256],[-0.53016,3.619892,-2.027451],[-0.822371,5.517453,-0.605747],[-2.474925,7.670892,-0.020174],[4.01571,0.830194,-0.013793],[-0.400092,5.094112,-1.041992],[-2.887284,5.581246,-0.525324],[-1.559841,6.050972,0.079301],[-0.469317,3.291673,-2.235211],[0.337397,3.467926,-2.295458],[-2.632074,5.573701,-0.582717],[-0.030318,6.011395,0.276616],[-0.934373,0.388987,-1.780523],[-2.661263,5.844838,-0.425966],[0.549353,5.489646,-0.807268],[-2.194355,6.197491,-0.109322],[-2.289618,5.664813,-0.581098],[1.583583,3.796366,-1.844498],[0.855295,0.215979,-1.425557],[-2.627569,5.300236,-0.767174],[4.333347,2.384332,0.399129],[-1.880401,5.583843,-0.696561],[-2.172346,5.324859,-0.846246],[-2.27058,5.906265,-0.388373],[-1.960049,5.889346,-0.397593],[0.965756,3.67547,-2.105671],[-2.014066,6.431125,0.287254],[-1.776173,5.287097,-0.89091],[-2.025852,5.089562,-0.980218],[-1.886418,6.108358,-0.000667],[-1.600803,5.785347,-0.491069],[-1.66188,4.968053,-1.042535],[-1.600621,5.962818,-0.188044],[-1.588831,5.615418,-0.665456],[4.46901,1.880138,0.057248],[-1.978845,0.927399,-0.554856],[-1.408074,5.325266,-0.83967],[1.923123,4.843955,-1.101389],[-2.87378,0.117106,-0.412735],[-1.222193,5.62638,-0.539981],[-2.632537,0.166349,-0.489218],[-1.370865,5.838832,-0.341026],[-1.067742,5.448874,-0.692701],[-1.073798,5.220878,-0.908779],[-1.147562,4.950417,-1.079727],[-2.789115,4.531047,-1.042713],[-3.550826,4.170487,-0.806058],[-3.331694,4.798177,-0.69568],[-3.689404,4.688543,-0.534317],[-3.511509,5.106246,-0.483632],[1.796344,0.076137,0.080455],[-3.306354,5.473605,-0.478764],[-2.692503,3.346604,-1.20959],[-3.963056,5.187462,3.113156],[-3.901231,6.391477,-0.246984],[4.484234,1.518638,-0.001617],[4.308829,1.657716,-0.119275],[4.290045,1.339528,-0.110626],[-3.514938,3.524974,-0.909109],[-2.1943,2.12163,-0.71966],[4.108206,1.091087,-0.11416],[3.785312,1.392435,-0.28588],[4.092886,1.480476,-0.210655],[-2.965937,6.469006,-0.379085],[-3.708581,2.962974,-0.63979],[-3.297971,2.218917,-0.299872],[3.806949,0.804703,-0.11438],[3.747957,1.059258,-0.273069],[-3.101827,4.111444,-1.006255],[-1.536445,4.658913,-1.195049],[-3.549826,2.450555,-0.375694],[-3.676495,2.108366,0.534323],[-3.674738,5.925075,-0.400011],[-2.250115,2.848335,-1.121174],[-3.698062,5.667567,-0.381396],[3.468966,0.734643,-0.190624],[-3.97972,5.670078,-0.26874],[-3.002087,4.337837,-1.033421],[-3.356392,2.608308,-0.713323],[-1.833016,3.359983,-1.28775],[-1.989069,3.632416,-1.305607],[3.591254,0.542371,0.026146],[3.364927,1.082572,-0.342613],[-3.393759,3.866801,-0.937266],[-4.124865,5.549529,-0.161729],[-4.423423,5.687223,0.000103],[-1.496881,2.601785,-1.114328],[-2.642297,6.496932,-0.264175],[-3.684236,6.819423,-0.320233],[-2.286996,3.167067,-1.246651],[-1.624896,8.44848,-0.530014],[-3.666787,2.159266,0.268149],[-2.402625,2.011243,-0.56446],[-2.736166,2.259839,-0.6943],[-2.168611,3.89078,-1.292206],[-2.065956,3.345708,-1.281346],[-2.778147,2.675605,-0.995706],[-3.507431,4.513272,-0.71829],[-2.301184,4.293911,-1.238182],[3.205808,0.211078,0.394349],[-2.129936,4.870577,-1.080781],[-2.287977,2.496593,-0.934069],[-2.701833,2.931814,-1.114509],[3.294795,0.50631,-0.081062],[-2.552829,7.468771,-0.021541],[3.06721,0.944066,-0.43074],[-2.86086,1.973622,-0.303132],[-3.598818,5.419613,-0.401645],[-1.524381,0.080156,-1.61662],[-1.907291,2.646274,-1.039438],[2.950783,0.407562,-0.105407],[-1.663048,1.655038,-0.689787],[-1.728102,1.110064,-0.635963],[-2.085823,7.686296,-0.159745],[2.883518,3.157009,-1.30858],[-2.724116,0.417169,-0.389719],[-1.788636,7.862672,-0.346413],[-2.186418,1.249609,-0.434583],[-3.092434,2.606657,-0.860002],[-1.737314,3.874201,-1.330986],[2.564522,0.422967,-0.390903],[1.670782,3.538432,-1.924753],[-2.338131,4.02578,-1.286673],[-1.916516,4.054121,-1.301788],[2.87159,2.034949,-1.267139],[-1.931518,3.062883,-1.197227],[-0.816602,0.135682,3.104104],[0.469392,0.213916,-1.489608],[2.574055,1.950091,-1.514427],[2.733595,2.682546,-1.461213],[-1.915407,4.693647,-1.151721],[-3.412883,5.867094,-0.450528],[2.28822,0.120432,-0.04102],[2.244477,0.14424,-0.376933],[-1.676198,3.570698,-1.328031],[-1.821193,4.366982,-1.266271],[-1.552208,8.099221,-0.53262],[-1.727419,2.39097,-0.989456],[-2.468226,4.711663,-1.069766],[-2.451669,6.113319,-0.273788],[2.635447,2.295842,-1.518361],[-2.020809,8.150253,-0.246714],[2.292455,0.805596,-1.3042],[2.641556,1.65665,-1.466962],[2.409062,2.842538,-1.635025],[2.456682,1.459484,-1.57543],[-1.691047,3.173582,-1.247082],[-1.865642,1.957608,-0.768683],[-3.401579,0.20407,0.100932],[2.301981,1.7102,-1.650461],[2.342929,2.611944,-1.690713],[-1.676111,2.923894,-1.17835],[-2.992039,3.547631,-1.118945],[-3.571677,6.504634,-0.375455],[2.141764,1.460869,-1.702464],[-3.221958,5.146049,-0.615632],[2.19238,2.949367,-1.747242],[2.320791,2.232971,-1.706842],[2.088678,2.585235,-1.813159],[-2.196404,0.592218,-0.569709],[-2.120811,1.836483,-0.62338],[-1.949935,2.271249,-0.874128],[2.235901,1.110183,-1.510719],[2.020157,3.241128,-1.803917],[2.054336,1.949394,-1.792332],[-3.094117,4.996595,-0.740238],[2.038063,0.635949,-1.402041],[1.980644,1.684408,-1.76778],[1.587432,3.306542,-1.991131],[1.935322,0.976267,-1.602208],[1.922621,1.235522,-1.698813],[1.712495,1.911874,-1.903234],[1.912802,2.259273,-1.888698],[1.884367,0.355453,-1.312633],[1.676427,0.76283,-1.539455],[1.78453,2.83662,-1.943035],[1.697312,0.120281,-1.150324],[1.648318,2.484973,-1.999505],[-4.051804,5.958472,-0.231731],[-1.964823,1.464607,-0.58115],[1.55996,2.183486,-1.971378],[1.628125,1.045912,-1.707832],[1.701684,1.540428,-1.827156],[1.567475,4.869481,-1.184665],[1.432492,0.843779,-1.648083],[1.173837,2.978983,-2.156687],[1.235287,3.37975,-2.09515],[1.252589,1.525293,-1.949205],[1.159334,2.336379,-2.105361],[1.49061,2.695263,-2.083216],[-4.122486,6.782604,-0.02545],[1.173388,0.279193,-1.423418],[1.505684,0.380815,-1.414395],[1.391423,1.343031,-1.843557],[1.263449,2.73225,-2.144961],[1.295858,0.597122,-1.515628],[1.245851,3.729126,-1.993015],[-2.761439,6.23717,-0.365856],[0.978887,1.664888,-2.046633],[1.219542,0.982729,-1.785486],[1.315915,1.91748,-2.02788],[-3.052746,2.127222,-0.369082],[0.977656,1.36223,-1.944119],[0.936122,3.39447,-2.203007],[-2.740036,4.184702,-1.122849],[0.853581,2.864694,-2.260847],[0.719569,0.818762,-1.763618],[0.839115,1.159359,-1.907943],[0.932069,1.94559,-2.117962],[0.579321,3.326747,-2.299369],[0.86324,0.597822,-1.565106],[0.574567,1.158452,-1.943123],[0.525138,2.137252,-2.213867],[0.779941,2.342019,-2.206157],[0.915255,2.618102,-2.209041],[0.526426,3.02241,-2.321826],[0.495431,2.521396,-2.295905],[0.80799,3.156817,-2.286432],[0.273556,1.304936,-2.012509],[0.664326,1.530024,-2.048722],[0.219173,2.32907,-2.323212],[0.405324,0.695359,-1.704884],[0.398827,0.946649,-1.843899],[0.345109,1.608829,-2.100174],[-2.356743,0.062032,-0.4947],[-3.001084,0.27146,2.560034],[-2.064663,0.303055,-0.697324],[0.221271,3.174023,-2.374399],[0.195842,0.437865,-1.621473],[-0.385613,0.297763,1.960096],[1.999609,0.108928,-0.79125],[0.351698,9.227494,-1.57565],[0.021477,2.191913,-2.309353],[0.246381,2.836575,-2.356365],[1.543281,0.237539,1.901906],[0.031881,9.147022,-1.454203],[-0.001881,1.648503,-2.108044],[0.333423,1.907088,-2.204533],[0.044063,2.634032,-2.368412],[-0.028148,3.053684,-2.390082],[0.02413,3.34297,-2.36544],[-0.272645,9.02879,-1.238685],[-0.006348,0.832044,-1.758222],[-0.321105,1.458754,-1.886313],[-0.153948,8.618809,-1.105353],[-0.409303,1.137783,-1.720556],[-0.410054,1.742789,-1.957989],[-0.287905,2.380404,-2.294509],[-0.261375,2.646629,-2.356322],[-0.221986,3.215303,-2.345844],[-0.31608,0.687581,-1.71901],[-0.537705,0.855802,-1.648585],[-0.142834,1.193053,-1.87371],[-0.24371,2.044435,-2.176958],[-0.437999,2.959748,-2.299698],[-0.78895,0.176226,-1.729046],[-0.608509,0.546932,-1.734032],[-0.693698,4.478782,-1.369372],[-0.669153,8.469645,-0.911149],[-0.741857,1.082705,-1.458474],[-0.554059,2.440325,-2.141785],[2.09261,0.153182,2.57581],[1.792547,0.111794,2.563777],[1.855787,0.189541,2.835089],[1.492601,0.232246,2.987681],[-0.284918,0.236687,3.429738],[2.604841,0.11997,1.01506],[0.331271,0.168113,3.124031],[0.280606,0.308368,2.495937],[0.544591,0.325711,2.081274],[0.193145,0.19154,-0.977556],[3.810099,0.42324,1.032202],[3.54622,0.379245,1.392814],[0.61402,0.276328,0.849356],[-1.198628,0.144953,2.911457],[4.17199,0.68037,1.391526],[0.88279,0.321339,2.059129],[1.93035,0.109992,2.054154],[1.620331,0.121986,2.37203],[2.374812,0.10921,1.734876],[-0.031227,0.294412,2.593687],[4.075018,0.561914,1.038065],[-0.570366,0.126583,2.975558],[0.950052,0.318463,1.804012],[1.130034,0.117125,0.98385],[2.123049,0.08946,1.665911],[2.087572,0.068621,0.335013],[2.927337,0.167117,0.289611],[0.528876,0.313434,3.205969],[1.174911,0.162744,1.328262],[-4.88844,5.59535,1.661134],[-4.709607,5.165338,1.324082],[0.871199,0.277021,1.263831],[-3.910877,2.349318,1.272269],[1.56824,0.118605,2.768112],[1.179176,0.152617,-0.858003],[1.634629,0.247872,2.128625],[-4.627425,5.126935,1.617836],[3.845542,0.54907,1.45601],[2.654006,0.165508,1.637169],[-0.678324,0.26488,1.974741],[2.451139,0.100377,0.213768],[0.633199,0.286719,0.403357],[-0.533042,0.2524,1.373267],[0.99317,0.171106,0.624966],[-0.100063,0.306466,2.170225],[1.245943,0.092351,0.661031],[1.390414,0.198996,-0.0864],[-4.457265,5.030531,2.138242],[2.89776,0.146575,1.297468],[1.802703,0.088824,-0.490405],[1.055447,0.309261,2.392437],[2.300436,0.142429,2.104254],[2.33399,0.187756,2.416935],[2.325183,0.134349,0.574063],[2.410924,0.370971,2.637115],[1.132924,0.290511,3.061],[1.764028,0.070212,-0.80535],[2.156994,0.397657,2.844061],[0.920711,0.225527,-0.882456],[-4.552135,5.24096,2.85514],[0.210016,0.309396,2.064296],[0.612067,0.136815,-1.086002],[3.150236,0.426757,1.802703],[-0.24824,0.282258,1.470997],[0.974269,0.301311,-0.640898],[-4.401413,5.03966,2.535553],[0.644319,0.274006,-0.817806],[0.332922,0.309077,0.108474],[3.610001,0.317447,0.689353],[3.335681,0.358195,0.118477],[0.623544,0.318983,-0.4193],[-0.11012,0.307747,1.831331],[-0.407528,0.291044,2.282935],[0.069783,0.285095,0.950289],[0.970135,0.310392,-0.283742],[0.840564,0.306898,0.098854],[-0.541827,0.267753,1.683795],[-3.956082,4.55713,2.297164],[-4.161036,2.834481,1.64183],[-4.093952,4.977551,2.747747],[2.661819,0.261867,1.926145],[-3.749926,2.161875,0.895238],[-2.497776,1.3629,0.791855],[0.691482,0.304968,1.582939],[-4.013193,4.830963,2.4769],[-3.639585,2.091265,1.304415],[-3.9767,2.563053,1.6284],[-3.979915,2.788616,1.977977],[0.388782,0.312656,1.709168],[-3.40873,1.877324,0.851652],[-3.671637,5.136974,3.170734],[-3.12964,1.852012,0.157682],[-3.629687,4.852698,2.686837],[-3.196164,1.793459,0.452804],[-3.746338,2.31357,1.648551],[2.992192,0.125251,0.575976],[-3.254051,0.054431,0.314152],[-3.474644,1.925288,1.134116],[-3.418372,2.022882,1.578901],[-2.920955,1.705403,0.29842],[-3.57229,2.152022,1.607572],[-3.251259,0.09013,-0.106174],[-3.299952,1.877781,1.348623],[-3.666819,2.441459,2.004838],[-2.912646,1.824748,-0.045348],[-3.399511,2.479484,2.340393],[-3.009754,0.015286,0.075567],[-3.381443,2.316937,2.156923],[-3.352801,2.133341,1.857366],[-3.01788,1.687685,0.645867],[-2.931857,1.678712,1.158472],[-3.301008,0.08836,0.591001],[1.358025,0.19795,1.599144],[-2.999565,1.845016,1.618396],[-2.767957,0.028397,-0.196436],[-2.93962,2.078779,2.140593],[-3.346648,2.674056,2.518097],[3.324322,0.20822,0.628605],[3.091677,0.137202,0.9345],[-2.881807,0.009952,0.318439],[-2.764946,1.786619,1.693439],[-2.905542,1.932343,1.900002],[-3.140854,2.271384,2.274946],[-2.88995,2.487856,2.574759],[-2.367194,-0.000943,-0.15576],[-3.050738,0.068703,0.742988],[-2.759525,1.55679,0.877782],[-3.151775,2.48054,2.482749],[-2.578618,-0.002885,0.165716],[-2.651618,1.877246,1.981189],[-2.933973,0.133731,1.631023],[1.047628,0.100284,-1.085248],[-1.585123,0.062083,-1.394896],[-2.287917,-0.002671,0.214434],[-2.524899,0.007481,0.471788],[-2.815492,2.188198,2.343294],[-2.095142,-0.003149,-0.094574],[-2.172686,-0.000133,0.47963],[-2.732704,0.074306,1.742079],[-2.49653,2.145668,2.42691],[-1.343683,0.047721,-1.506391],[-2.581185,0.048703,0.975528],[-2.905101,0.083158,2.010052],[-2.601514,2.007801,2.223089],[-2.339464,0.02634,1.484304],[-2.907873,0.10367,2.378149],[-1.368796,0.062516,-1.049125],[-1.93244,0.02443,-0.427603],[-2.705081,0.060513,2.303802],[3.372155,0.206274,0.892293],[-1.761827,0.093202,-1.037404],[-1.700667,0.0397,-0.614221],[-1.872291,0.011979,-0.135753],[-1.929257,0.074005,0.728999],[-2.520128,0.049665,1.99054],[-2.699411,0.10092,2.603116],[3.211701,0.27302,1.423357],[-1.445362,0.1371,-0.626491],[2.921332,0.259112,1.645525],[-0.993242,0.058686,-1.408916],[-0.944986,0.157541,-1.097665],[-2.154301,0.032749,1.882001],[-2.108789,1.988557,2.442673],[-1.015659,0.25497,-0.416665],[-1.898411,0.015872,0.16715],[-1.585517,0.027121,0.453445],[-2.311105,0.061264,2.327061],[-2.637042,0.152224,2.832201],[-2.087515,2.292972,2.617585],[-0.750611,0.056697,-1.504516],[-0.472029,0.075654,-1.360203],[-0.710798,0.139244,-1.183863],[-0.97755,0.26052,-0.831167],[-0.655814,0.260843,-0.880068],[-0.897513,0.275537,-0.133042],[-2.049194,0.084947,2.455422],[-0.177837,0.076362,-1.449009],[-0.553393,0.279083,-0.59573],[-1.788636,0.06163,2.231198],[-0.34761,0.255578,-0.999614],[-1.398589,0.036482,0.65871],[-1.133918,0.05617,0.69473],[-1.43369,0.058226,1.977865],[-2.505459,1.492266,1.19295]],\"faces\":[[2,1661,3],[1676,7,6],[712,1694,9],[3,1674,1662],[11,1672,0],[1705,0,1],[5,6,1674],[4,5,1674],[7,8,712],[2,1662,10],[1,10,1705],[11,1690,1672],[1705,11,0],[5,1676,6],[7,9,6],[7,712,9],[2,3,1662],[3,4,1674],[1,2,10],[12,82,1837],[1808,12,1799],[1808,1799,1796],[12,861,82],[861,1808,13],[1808,861,12],[1799,12,1816],[1680,14,1444],[15,17,16],[14,1678,1700],[16,17,1679],[15,1660,17],[14,1084,1678],[15,1708,18],[15,18,1660],[1680,1084,14],[1680,15,1084],[15,1680,1708],[793,813,119],[1076,793,119],[1076,1836,22],[23,19,20],[21,1076,22],[21,22,23],[23,20,21],[1076,119,1836],[806,634,470],[432,1349,806],[251,42,125],[809,1171,791],[953,631,827],[634,1210,1176],[157,1832,1834],[56,219,53],[126,38,83],[37,85,43],[59,1151,1154],[83,75,41],[77,85,138],[201,948,46],[1362,36,37],[452,775,885],[1237,95,104],[966,963,1262],[85,77,43],[36,85,37],[1018,439,1019],[41,225,481],[85,83,127],[93,83,41],[935,972,962],[116,93,100],[98,82,813],[41,75,225],[298,751,54],[1021,415,1018],[77,138,128],[766,823,1347],[593,121,573],[905,885,667],[786,744,747],[100,41,107],[604,334,765],[779,450,825],[968,962,969],[225,365,481],[365,283,196],[161,160,303],[875,399,158],[328,1817,954],[62,61,1079],[358,81,72],[74,211,133],[160,161,138],[91,62,1079],[167,56,1405],[56,167,219],[913,914,48],[344,57,102],[43,77,128],[1075,97,1079],[389,882,887],[219,108,53],[1242,859,120],[604,840,618],[754,87,762],[197,36,1362],[1439,88,1200],[1652,304,89],[81,44,940],[445,463,151],[717,520,92],[129,116,100],[1666,1811,624],[1079,97,91],[62,91,71],[688,898,526],[463,74,133],[278,826,99],[961,372,42],[799,94,1007],[100,93,41],[1314,943,1301],[184,230,109],[875,1195,231],[133,176,189],[751,755,826],[101,102,57],[1198,513,117],[748,518,97],[1145,1484,1304],[358,658,81],[971,672,993],[445,151,456],[252,621,122],[36,271,126],[85,36,126],[116,83,93],[141,171,1747],[1081,883,103],[1398,1454,149],[457,121,593],[127,116,303],[697,70,891],[457,891,1652],[1058,1668,112],[518,130,97],[214,319,131],[185,1451,1449],[463,133,516],[1428,123,177],[113,862,561],[215,248,136],[186,42,251],[127,83,116],[160,85,127],[162,129,140],[154,169,1080],[169,170,1080],[210,174,166],[1529,1492,1524],[450,875,231],[399,875,450],[171,141,170],[113,1155,452],[131,319,360],[44,175,904],[452,872,113],[746,754,407],[147,149,150],[309,390,1148],[53,186,283],[757,158,797],[303,129,162],[429,303,162],[154,168,169],[673,164,193],[38,271,75],[320,288,1022],[246,476,173],[175,548,904],[182,728,456],[199,170,169],[168,199,169],[199,171,170],[184,238,230],[246,247,180],[1496,1483,1467],[147,150,148],[828,472,445],[53,108,186],[56,53,271],[186,961,42],[1342,391,57],[1664,157,1834],[1070,204,178],[178,204,179],[285,215,295],[692,55,360],[192,193,286],[359,673,209],[586,195,653],[121,89,573],[202,171,199],[238,515,311],[174,210,240],[174,105,166],[717,276,595],[1155,1149,452],[1405,56,197],[53,283,30],[75,53,30],[45,235,1651],[210,166,490],[181,193,192],[185,620,217],[26,798,759],[1070,226,204],[220,187,179],[220,168,187],[202,222,171],[359,209,181],[182,456,736],[964,167,1405],[76,250,414],[807,1280,1833],[70,883,1652],[227,179,204],[221,199,168],[221,202,199],[360,494,131],[214,241,319],[105,247,166],[205,203,260],[388,480,939],[482,855,211],[8,807,1833],[226,255,204],[228,221,168],[166,173,490],[701,369,702],[211,855,262],[631,920,630],[1448,1147,1584],[255,227,204],[237,220,179],[228,168,220],[222,256,555],[215,259,279],[126,271,38],[108,50,186],[227,236,179],[236,237,179],[220,237,228],[228,202,221],[256,222,202],[555,256,229],[259,152,279],[27,1296,31],[186,50,961],[961,234,372],[1651,235,812],[1572,1147,1448],[255,226,1778],[255,236,227],[256,257,229],[106,184,109],[241,410,188],[177,578,620],[209,673,181],[1136,1457,79],[1507,245,718],[255,273,236],[275,410,241],[206,851,250],[1459,253,1595],[1406,677,1650],[228,274,202],[202,281,256],[348,239,496],[205,172,203],[369,248,702],[261,550,218],[261,465,550],[574,243,566],[921,900,1220],[291,273,255],[348,238,265],[109,230,194],[149,380,323],[443,270,421],[272,291,255],[274,228,237],[274,292,202],[281,257,256],[276,543,341],[152,259,275],[1111,831,249],[632,556,364],[299,273,291],[299,236,273],[280,237,236],[202,292,281],[247,246,173],[282,49,66],[1620,1233,1553],[299,280,236],[280,305,237],[237,305,274],[306,292,274],[330,257,281],[246,194,264],[166,247,173],[912,894,896],[611,320,244],[1154,1020,907],[969,962,290],[272,299,291],[305,318,274],[145,212,240],[164,248,285],[259,277,275],[193,164,295],[269,240,210],[1033,288,320],[46,948,206],[336,280,299],[330,281,292],[257,307,300],[369,136,248],[145,240,269],[502,84,465],[193,295,286],[164,285,295],[282,302,49],[161,303,429],[318,306,274],[306,330,292],[315,257,330],[315,307,257],[307,352,300],[300,352,308],[275,277,403],[353,1141,333],[1420,425,47],[611,313,320],[85,126,83],[128,1180,43],[303,116,129],[280,314,305],[314,318,305],[190,181,242],[203,214,131],[820,795,815],[322,299,272],[322,336,299],[315,339,307],[172,152,617],[172,214,203],[321,1033,320],[1401,941,946],[85,160,138],[976,454,951],[747,60,786],[317,322,272],[339,352,307],[266,33,867],[163,224,218],[247,614,180],[648,639,553],[388,172,205],[611,345,313],[313,345,320],[160,127,303],[454,672,951],[317,329,322],[314,280,336],[306,338,330],[330,339,315],[1236,115,436],[342,321,320],[1046,355,328],[328,346,325],[325,346,317],[367,314,336],[314,337,318],[337,306,318],[338,343,330],[342,320,345],[355,349,328],[346,329,317],[347,336,322],[314,362,337],[330,343,339],[340,308,352],[135,906,1022],[239,156,491],[194,230,486],[40,1015,1003],[321,355,1046],[329,382,322],[382,347,322],[347,367,336],[337,371,306],[306,371,338],[1681,296,1493],[286,172,388],[230,348,486],[348,183,486],[384,332,830],[328,349,346],[367,362,314],[371,343,338],[339,351,352],[57,344,78],[342,355,321],[386,346,349],[386,350,346],[346,350,329],[347,366,367],[343,363,339],[323,380,324],[152,275,241],[345,1045,342],[350,374,329],[339,363,351],[234,340,352],[353,361,354],[40,34,1015],[373,355,342],[373,349,355],[374,382,329],[366,347,382],[371,363,343],[351,379,352],[379,372,352],[372,234,352],[156,190,491],[319,241,692],[354,361,31],[366,377,367],[363,379,351],[133,590,516],[197,56,271],[1045,370,342],[370,373,342],[374,350,386],[377,366,382],[367,395,362],[400,337,362],[400,371,337],[378,363,371],[106,109,614],[181,673,193],[953,920,631],[376,349,373],[376,386,349],[378,379,363],[224,375,218],[279,152,172],[361,619,381],[1347,823,795],[760,857,384],[392,374,386],[394,395,367],[383,371,400],[383,378,371],[218,375,261],[197,271,36],[414,454,976],[385,376,373],[1051,382,374],[387,394,367],[377,387,367],[395,400,362],[279,172,295],[30,365,225],[450,231,825],[385,373,370],[398,374,392],[1051,377,382],[396,378,383],[348,496,183],[295,172,286],[357,269,495],[1148,390,1411],[75,30,225],[206,76,54],[412,386,376],[412,392,386],[396,383,400],[651,114,878],[123,1241,506],[238,311,265],[381,653,29],[618,815,334],[427,1032,411],[298,414,976],[791,332,384],[129,100,140],[412,404,392],[392,404,398],[140,107,360],[395,394,400],[423,379,378],[385,412,376],[406,94,58],[419,415,1021],[422,423,378],[423,125,379],[258,508,238],[311,156,265],[213,287,491],[449,411,1024],[412,1068,404],[55,140,360],[76,414,54],[394,416,400],[400,416,396],[422,378,396],[1258,796,789],[427,411,449],[427,297,1032],[1385,1366,483],[417,448,284],[1507,341,245],[162,140,444],[658,44,81],[433,125,423],[438,251,125],[429,162,439],[1342,57,1348],[765,766,442],[697,891,695],[1057,396,416],[440,423,422],[440,433,423],[433,438,125],[438,196,251],[74,482,211],[1136,79,144],[29,195,424],[242,1004,492],[57,757,28],[414,298,54],[238,348,230],[224,163,124],[295,215,279],[495,269,490],[449,446,427],[446,297,427],[1020,1163,909],[128,138,419],[66,980,443],[415,439,1018],[111,396,1057],[111,422,396],[840,249,831],[593,664,596],[218,550,155],[109,194,180],[483,268,855],[161,415,419],[1737,232,428],[360,107,494],[1006,1011,410],[444,140,55],[919,843,430],[190,242,213],[275,403,410],[131,494,488],[449,663,446],[138,161,419],[128,419,34],[439,162,444],[460,440,422],[440,438,433],[472,74,445],[491,190,213],[238,508,515],[46,206,54],[972,944,962],[1241,1428,1284],[111,460,422],[470,432,806],[248,164,702],[1025,467,453],[553,1235,648],[263,114,881],[267,293,896],[469,438,440],[455,196,438],[287,242,492],[239,265,156],[213,242,287],[1684,746,63],[663,474,446],[415,161,429],[140,100,107],[1055,459,467],[469,455,438],[259,542,277],[446,474,466],[446,466,447],[439,444,1019],[614,109,180],[190,359,181],[156,497,190],[726,474,663],[1023,458,459],[461,440,460],[269,210,490],[246,180,194],[590,133,189],[163,218,155],[467,468,453],[1063,1029,111],[111,1029,460],[1029,464,460],[461,469,440],[150,149,323],[828,445,456],[375,502,261],[474,475,466],[573,426,462],[478,1023,477],[478,458,1023],[458,479,467],[459,458,467],[468,393,453],[464,461,460],[484,365,455],[1232,182,1380],[172,617,214],[547,694,277],[542,547,277],[184,258,238],[261,502,465],[467,479,468],[484,455,469],[1380,182,864],[475,476,466],[80,447,476],[466,476,447],[415,429,439],[479,487,468],[487,287,468],[492,393,468],[260,469,461],[481,365,484],[531,473,931],[692,360,319],[726,495,474],[468,287,492],[480,464,1029],[260,461,464],[494,481,484],[74,472,482],[174,240,212],[223,106,614],[486,477,485],[478,496,458],[491,487,479],[123,402,177],[488,469,260],[488,484,469],[265,239,348],[248,215,285],[474,490,475],[477,486,478],[458,496,479],[239,491,479],[1584,1147,1334],[488,494,484],[401,123,506],[495,490,474],[490,173,475],[80,476,264],[491,287,487],[480,1029,1004],[480,205,464],[173,476,475],[485,194,486],[486,183,478],[478,183,496],[496,239,479],[848,1166,60],[268,262,855],[205,260,464],[260,203,488],[203,131,488],[246,264,476],[194,485,264],[1002,310,1664],[311,515,497],[515,359,497],[565,359,515],[1250,1236,301],[736,456,151],[654,174,567],[577,534,648],[519,505,645],[725,565,508],[150,1723,148],[584,502,505],[584,526,502],[502,526,84],[607,191,682],[560,499,660],[607,517,191],[1038,711,124],[951,672,971],[716,507,356],[868,513,1198],[615,794,608],[682,191,174],[1313,928,1211],[617,241,214],[511,71,91],[408,800,792],[192,286,525],[80,485,447],[91,97,130],[1675,324,888],[207,756,532],[582,1097,1124],[311,497,156],[510,130,146],[523,511,510],[608,708,616],[546,690,650],[511,527,358],[536,146,518],[465,418,550],[418,709,735],[520,514,500],[584,505,519],[536,518,509],[146,536,510],[538,527,511],[876,263,669],[646,524,605],[510,536,523],[527,175,358],[724,876,669],[721,724,674],[524,683,834],[558,509,522],[558,536,509],[523,538,511],[611,243,574],[528,706,556],[668,541,498],[523,537,538],[527,540,175],[532,756,533],[1013,60,747],[551,698,699],[92,520,500],[535,536,558],[536,569,523],[538,540,527],[539,548,175],[567,212,145],[401,896,293],[534,675,639],[1510,595,1507],[557,545,530],[569,536,535],[537,540,538],[540,539,175],[569,537,523],[1135,718,47],[587,681,626],[580,535,558],[99,747,278],[701,565,725],[665,132,514],[665,514,575],[132,549,653],[176,651,189],[65,47,266],[597,569,535],[569,581,537],[537,581,540],[563,539,540],[539,564,548],[1509,1233,1434],[132,653,740],[550,710,155],[714,721,644],[410,1011,188],[732,534,586],[560,562,729],[555,557,222],[580,558,545],[597,535,580],[581,563,540],[5,821,1676],[576,215,136],[649,457,741],[564,539,563],[124,711,224],[550,668,710],[550,541,668],[565,701,673],[560,613,499],[233,532,625],[545,555,580],[601,581,569],[594,904,548],[1463,1425,434],[185,149,1454],[721,674,644],[185,380,149],[577,424,586],[462,586,559],[597,601,569],[594,548,564],[566,603,574],[165,543,544],[457,89,121],[586,424,195],[725,587,606],[1078,582,1124],[588,925,866],[462,559,593],[189,878,590],[555,229,580],[602,563,581],[904,594,956],[434,1425,1438],[1024,112,821],[572,587,626],[600,597,580],[599,591,656],[600,580,229],[601,622,581],[581,622,602],[602,564,563],[602,594,564],[603,611,574],[498,529,546],[697,1145,70],[592,628,626],[610,597,600],[597,610,601],[222,557,171],[604,765,799],[573,462,593],[133,200,176],[729,607,627],[1011,692,188],[518,146,130],[585,687,609],[682,627,607],[1712,599,656],[562,592,607],[643,656,654],[257,600,229],[601,633,622],[623,594,602],[174,212,567],[725,606,701],[609,701,606],[610,633,601],[633,642,622],[380,216,324],[142,143,1249],[501,732,586],[534,577,586],[648,1235,577],[610,641,633],[310,1002,1831],[618,334,604],[1710,145,269],[707,498,659],[501,586,462],[625,501,462],[726,663,691],[300,600,257],[641,610,600],[622,629,602],[602,629,623],[55,692,444],[518,748,509],[929,1515,1411],[620,578,267],[71,511,358],[707,668,498],[650,687,585],[600,300,641],[641,657,633],[1675,888,1669],[622,636,629],[505,502,375],[541,529,498],[332,420,1053],[637,551,638],[534,639,648],[69,623,873],[300,512,641],[633,657,642],[562,660,579],[687,637,638],[709,646,605],[775,738,885],[559,549,132],[646,683,524],[641,512,657],[266,897,949],[1712,643,1657],[184,727,258],[674,724,669],[699,714,647],[628,659,572],[657,662,642],[571,881,651],[517,607,504],[598,706,528],[598,694,547],[640,552,560],[655,693,698],[698,693,721],[91,510,511],[144,301,1136],[324,216,888],[870,764,1681],[575,514,520],[276,544,543],[658,175,44],[645,505,711],[659,546,572],[700,524,655],[605,700,529],[266,867,897],[1695,1526,764],[579,659,628],[654,591,682],[586,549,559],[698,721,714],[896,401,506],[640,734,599],[664,665,575],[621,629,636],[1712,656,643],[547,644,598],[710,668,707],[640,560,734],[655,698,551],[694,528,277],[512,662,657],[504,592,626],[688,584,519],[152,241,617],[587,725,681],[598,669,706],[526,670,84],[598,528,694],[710,707,499],[579,592,562],[660,659,579],[323,324,1134],[326,895,473],[195,29,653],[84,670,915],[560,660,562],[504,626,681],[711,505,224],[651,881,114],[216,620,889],[1362,678,197],[493,99,48],[1659,691,680],[529,690,546],[430,843,709],[655,524,693],[174,191,105],[674,669,598],[98,712,82],[572,546,585],[72,61,71],[912,911,894],[106,223,184],[664,132,665],[843,646,709],[635,699,136],[699,698,714],[593,132,664],[688,526,584],[185,177,620],[533,675,534],[687,638,635],[1652,89,457],[896,506,912],[132,740,514],[689,685,282],[691,449,680],[48,436,493],[136,699,647],[739,640,554],[549,586,653],[532,533,625],[1530,695,649],[653,381,619],[736,151,531],[188,692,241],[177,402,578],[33,689,867],[689,33,685],[593,559,132],[949,65,266],[711,1038,661],[939,480,1004],[609,369,701],[616,552,615],[619,361,740],[151,463,516],[513,521,117],[691,663,449],[186,251,196],[333,302,327],[613,560,552],[616,613,552],[690,551,637],[660,707,659],[704,208,1203],[418,735,550],[163,708,124],[524,834,693],[554,640,599],[245,341,165],[565,673,359],[155,710,708],[105,191,517],[1515,198,1411],[1709,554,599],[60,289,786],[838,1295,1399],[533,534,625],[710,499,708],[556,632,410],[217,620,216],[591,627,682],[504,503,223],[643,654,567],[690,637,650],[545,557,555],[174,654,682],[719,691,1659],[727,681,508],[645,711,661],[794,615,739],[565,515,508],[282,685,302],[1150,397,1149],[638,699,635],[544,685,33],[719,726,691],[1742,1126,1733],[1724,1475,148],[556,410,403],[185,217,380],[503,504,681],[277,556,403],[32,1178,158],[1712,1709,599],[605,529,541],[635,136,369],[687,635,369],[529,700,690],[700,551,690],[89,304,573],[625,534,732],[730,302,685],[503,681,727],[702,673,701],[730,327,302],[327,353,333],[596,664,575],[660,499,707],[585,546,650],[560,729,734],[700,655,551],[176,571,651],[517,504,223],[730,685,544],[1661,1682,726],[1682,495,726],[1250,301,917],[605,524,700],[609,687,369],[516,389,895],[1553,686,1027],[673,702,164],[656,591,654],[520,596,575],[402,123,401],[828,456,728],[1645,677,1653],[528,556,277],[638,551,699],[190,497,359],[276,730,544],[1117,1525,933],[1027,686,1306],[155,708,163],[709,605,541],[647,644,547],[650,637,687],[599,734,591],[578,293,267],[1682,357,495],[510,91,130],[734,729,627],[576,542,215],[709,541,735],[735,541,550],[276,500,730],[500,327,730],[653,619,740],[414,851,454],[734,627,591],[729,562,607],[615,552,640],[525,181,192],[308,512,300],[223,503,727],[266,165,33],[92,500,276],[321,1046,1033],[585,609,606],[1200,1559,86],[628,572,626],[301,436,803],[714,644,647],[708,499,613],[721,693,724],[514,353,327],[353,740,361],[344,158,78],[708,613,616],[615,640,739],[500,514,327],[514,740,353],[1449,177,185],[462,233,625],[851,405,1163],[608,616,615],[647,542,576],[625,732,501],[1097,582,1311],[1235,424,577],[579,628,592],[607,592,504],[24,432,470],[105,614,247],[104,742,471],[542,259,215],[365,196,455],[1420,47,65],[223,727,184],[547,542,647],[572,585,606],[587,572,606],[262,780,1370],[647,576,136],[644,674,598],[271,53,75],[727,508,258],[471,742,142],[505,375,224],[357,1710,269],[725,508,681],[659,498,546],[743,1178,32],[1195,634,231],[1176,24,470],[743,1110,1178],[135,809,857],[63,746,407],[634,1176,470],[159,1112,27],[1176,1685,24],[399,450,779],[1178,856,875],[751,744,54],[436,48,772],[634,1108,1210],[769,1285,1286],[751,298,755],[746,1684,754],[754,924,87],[722,1625,756],[87,839,153],[489,795,820],[758,808,1518],[839,840,153],[831,1111,959],[1111,749,959],[810,1253,1363],[1247,1394,713],[1388,1329,1201],[1242,120,761],[857,791,384],[758,1523,808],[296,764,1504],[70,1652,891],[207,233,1638],[1348,57,28],[858,420,332],[964,1379,1278],[420,1194,816],[784,1076,1186],[1076,21,1186],[1710,767,1],[849,822,778],[806,137,787],[786,790,744],[790,54,744],[771,63,407],[785,852,818],[774,1823,272],[895,151,516],[135,1022,809],[99,826,48],[48,826,755],[808,705,408],[833,441,716],[1733,743,32],[1385,836,852],[772,827,737],[1005,49,781],[793,1697,813],[1518,441,1537],[1139,1132,859],[782,801,770],[1510,1530,676],[770,814,835],[231,787,825],[207,722,756],[26,771,798],[782,863,865],[832,54,790],[865,842,507],[799,765,94],[1175,1261,1353],[800,408,805],[262,986,200],[792,800,814],[801,792,770],[704,1203,1148],[356,1514,822],[165,544,33],[561,776,113],[1043,738,775],[815,831,820],[773,792,801],[772,48,914],[772,737,803],[436,772,803],[808,817,705],[1624,822,1527],[588,1144,788],[799,762,604],[821,1520,1676],[854,803,666],[828,482,472],[445,74,463],[831,489,820],[828,836,482],[716,782,763],[334,815,766],[815,823,766],[334,766,765],[819,805,837],[1716,1521,1412],[1684,924,754],[800,805,819],[1709,829,554],[806,1349,137],[99,1013,747],[341,595,276],[817,810,818],[1176,1691,1685],[763,782,865],[830,846,1052],[865,1499,842],[982,846,1053],[847,832,790],[1178,875,158],[817,818,705],[1302,1392,45],[96,417,284],[223,614,517],[356,507,1514],[1166,848,1179],[1349,432,26],[717,92,276],[770,835,863],[522,509,1745],[847,841,832],[832,841,46],[829,739,554],[802,824,39],[397,1043,775],[1567,849,778],[1385,483,855],[1349,26,1346],[441,801,782],[402,401,293],[1043,667,738],[759,798,1007],[819,837,728],[728,837,828],[837,852,828],[1537,441,833],[148,1475,147],[805,705,837],[716,441,782],[483,1371,780],[814,819,844],[845,753,1336],[1661,719,4],[862,847,790],[737,827,666],[201,46,841],[810,785,818],[408,705,805],[1560,1536,849],[1585,853,1786],[7,1668,807],[7,807,8],[822,1514,1527],[800,819,814],[847,862,841],[991,857,760],[705,818,837],[808,408,773],[402,293,578],[791,858,332],[1480,1228,1240],[814,844,835],[785,1385,852],[1132,120,859],[1743,1726,684],[1704,783,1279],[1623,1694,1731],[959,489,831],[1518,808,773],[862,872,841],[441,773,801],[331,512,308],[380,217,216],[841,872,201],[818,852,837],[448,1480,1240],[856,1108,1195],[1527,1514,1526],[819,182,1232],[871,724,693],[852,836,828],[770,792,814],[803,737,666],[751,826,278],[1674,1727,1699],[849,356,822],[871,693,834],[507,842,1514],[1406,1097,869],[1328,1349,1346],[823,815,795],[744,751,278],[1110,856,1178],[520,717,316],[871,834,683],[884,876,724],[165,266,47],[716,763,507],[216,889,888],[853,1585,1570],[1536,716,356],[886,873,623],[782,770,863],[432,24,26],[683,882,871],[884,724,871],[114,876,884],[516,590,389],[11,1218,1628],[862,113,872],[886,623,629],[830,1052,1120],[762,153,604],[773,408,792],[763,865,507],[153,840,604],[882,884,871],[531,151,326],[886,890,873],[133,262,200],[819,1232,844],[621,636,122],[645,892,519],[1130,1076,784],[114,263,876],[1670,10,1663],[911,670,894],[452,885,872],[872,885,201],[887,882,683],[878,884,882],[590,878,882],[890,867,689],[897,629,621],[897,886,629],[819,728,182],[519,893,688],[894,670,526],[898,894,526],[1536,356,849],[810,1363,785],[878,114,884],[879,888,892],[892,889,893],[893,898,688],[895,683,843],[895,887,683],[889,620,267],[590,882,389],[418,465,84],[949,897,621],[897,890,886],[889,267,893],[898,267,896],[531,326,473],[189,651,878],[843,683,646],[897,867,890],[888,889,892],[893,267,898],[896,894,898],[473,895,843],[895,389,887],[974,706,669],[513,1115,521],[326,151,895],[809,791,857],[211,262,133],[920,923,947],[923,90,947],[90,25,947],[25,972,935],[64,431,899],[52,899,901],[903,905,59],[437,967,73],[839,1242,761],[904,975,44],[917,301,144],[915,670,911],[905,201,885],[1684,63,1685],[1033,1194,288],[950,913,755],[912,918,911],[950,914,913],[506,918,912],[922,919,915],[911,922,915],[1004,451,492],[1263,553,639],[922,911,918],[630,920,947],[916,506,926],[916,918,506],[521,1115,1098],[916,922,918],[919,418,915],[83,38,75],[24,1685,771],[110,1230,1213],[712,8,1837],[922,930,919],[919,430,418],[1395,1402,1187],[930,922,916],[594,623,69],[35,431,968],[35,968,969],[866,924,1684],[1625,1263,675],[631,630,52],[930,931,919],[430,709,418],[302,333,49],[1446,978,1138],[799,1007,798],[931,843,919],[947,25,64],[885,738,667],[1262,963,964],[899,970,901],[1401,946,938],[1117,933,1091],[1685,63,771],[905,948,201],[979,937,980],[951,953,950],[937,270,443],[1154,903,59],[1194,954,1067],[909,405,907],[850,1151,59],[1769,811,1432],[76,206,250],[938,946,966],[965,927,942],[938,966,957],[955,975,904],[927,965,934],[52,51,631],[59,905,667],[431,935,968],[786,289,561],[252,122,671],[481,494,107],[954,1817,1067],[795,25,90],[958,965,945],[795,972,25],[902,983,955],[972,489,944],[1256,29,424],[671,331,945],[946,958,963],[956,955,904],[902,955,956],[671,512,331],[945,331,961],[662,671,122],[671,662,512],[934,65,927],[630,947,52],[666,631,910],[850,59,667],[961,331,234],[1024,411,1042],[890,69,873],[252,671,945],[975,290,940],[283,186,196],[30,283,365],[950,755,298],[946,965,958],[985,290,975],[969,290,985],[405,851,206],[935,431,64],[941,1423,1420],[964,963,167],[942,252,945],[78,757,57],[49,1005,66],[937,979,270],[631,666,827],[980,937,443],[66,689,282],[421,902,956],[947,64,52],[35,979,899],[951,971,953],[762,87,153],[27,31,381],[924,839,87],[946,963,966],[331,308,340],[957,966,1262],[473,843,931],[953,971,920],[270,969,902],[935,962,968],[51,1005,781],[969,983,902],[437,73,940],[69,421,956],[761,249,840],[263,974,669],[962,944,967],[962,437,290],[985,975,955],[907,405,948],[720,957,1262],[25,935,64],[176,200,571],[108,945,50],[250,851,414],[200,986,571],[881,974,263],[827,772,953],[970,899,980],[29,159,27],[234,331,340],[948,405,206],[980,899,979],[986,984,571],[571,984,881],[990,706,974],[946,934,965],[970,980,66],[1113,1486,1554],[984,981,881],[881,987,974],[689,66,443],[1005,901,66],[983,985,955],[165,47,718],[987,990,974],[1370,986,262],[901,970,66],[51,901,1005],[981,987,881],[988,706,990],[942,945,965],[290,437,940],[64,899,52],[988,556,706],[941,934,946],[431,35,899],[996,989,984],[984,989,981],[981,989,987],[35,969,270],[1370,995,986],[986,995,984],[989,999,987],[987,992,990],[992,988,990],[962,967,437],[951,950,976],[979,35,270],[421,270,902],[998,995,1370],[987,999,992],[988,364,556],[969,985,983],[689,443,890],[995,1000,984],[219,958,108],[998,1000,995],[999,997,992],[914,953,772],[845,1336,745],[806,787,231],[1000,996,984],[989,996,999],[50,945,961],[443,421,69],[797,158,779],[1098,1463,434],[996,1009,999],[1001,988,992],[1001,364,988],[903,907,905],[26,759,973],[997,1001,992],[632,364,1001],[1346,26,973],[998,1008,1000],[1000,1009,996],[531,931,736],[252,949,621],[286,388,525],[1174,1008,998],[1009,1010,999],[999,1010,997],[1014,1001,997],[614,105,517],[958,945,108],[525,1004,242],[963,958,219],[233,426,304],[1000,1008,1009],[1010,1014,997],[1001,1006,632],[824,413,39],[642,636,622],[480,388,205],[28,757,797],[1014,1006,1001],[1006,410,632],[975,940,44],[1234,420,858],[54,832,46],[1009,1012,1010],[167,963,219],[41,481,107],[1017,1010,1012],[122,636,662],[939,525,388],[525,939,1004],[950,953,914],[829,1735,739],[1008,880,1015],[1008,1015,1009],[1263,639,675],[956,594,69],[795,90,1347],[1179,848,1013],[759,1007,973],[1009,1015,1012],[1012,1016,1017],[1017,1014,1010],[1019,1011,1006],[927,65,949],[649,316,595],[913,48,755],[976,950,298],[1003,1015,880],[1018,1006,1014],[1021,1018,1014],[444,692,1011],[451,1029,1063],[1185,851,1163],[29,27,381],[181,525,242],[1021,1014,1017],[1016,1021,1017],[1018,1019,1006],[1019,444,1011],[927,949,942],[451,393,492],[903,1154,907],[391,101,57],[94,765,58],[419,1016,1012],[949,252,942],[907,1020,909],[765,442,58],[94,406,908],[1007,94,908],[34,1012,1015],[34,419,1012],[419,1021,1016],[451,1057,393],[907,948,905],[1034,1073,1039],[1061,906,1619],[1068,960,1034],[471,1249,104],[112,1024,1042],[372,379,125],[341,543,165],[141,1094,170],[566,243,1061],[398,1034,1039],[325,317,1823],[1493,296,1724],[850,667,1043],[1054,297,1065],[1619,135,1074],[1061,243,906],[680,1024,821],[1103,96,1245],[1440,1123,1491],[1047,1025,1044],[672,454,1231],[1484,697,1530],[993,672,1231],[178,154,1088],[1044,1041,1066],[112,1062,1058],[1530,649,676],[178,1088,1040],[1046,328,954],[243,244,1022],[954,1194,1033],[1042,411,1032],[971,993,1056],[960,1093,1034],[1754,1338,232],[385,1064,412],[1057,1063,111],[748,1071,1447],[1530,697,695],[971,1056,1270],[977,1059,1211],[649,741,316],[1060,1452,1030],[353,354,1323],[695,768,649],[398,404,1034],[596,316,741],[1836,119,13],[1513,1115,1528],[883,1081,1652],[1039,1073,1048],[462,426,233],[31,1296,354],[1055,1047,1066],[1032,1054,1045],[1521,310,1224],[119,861,13],[1194,1234,288],[1109,1771,1070],[1166,1160,776],[1044,1035,1041],[1026,960,1064],[1050,1032,1045],[1049,1041,387],[115,1013,99],[1046,954,1033],[1321,920,971],[611,1058,345],[1048,1066,1049],[1023,1055,1073],[1029,451,1004],[118,1094,141],[1094,1080,170],[1042,1032,1050],[1026,1064,385],[15,16,1084],[1096,1079,61],[1075,1071,748],[325,1817,328],[909,1163,405],[1022,1234,809],[374,398,1051],[1082,72,81],[1023,1034,1093],[1817,1794,1067],[86,1445,1400],[1507,1535,1510],[1079,1096,1075],[568,1478,1104],[1070,178,1040],[1034,1023,1073],[776,1155,113],[1103,143,142],[1140,81,73],[1082,81,1140],[1060,1030,936],[1040,1086,1109],[370,1065,385],[61,72,1082],[1087,1096,1144],[1040,1088,1086],[1651,812,752],[1062,1050,1045],[187,154,178],[179,187,178],[1099,1344,1101],[1668,1058,807],[1073,1055,1048],[1099,1336,1344],[1283,943,1123],[1049,387,1051],[1024,680,449],[61,1082,1100],[967,749,1111],[1439,1037,88],[742,1505,142],[398,1039,1051],[1107,1336,1099],[1344,1542,1101],[142,1505,1103],[477,1093,447],[477,1023,1093],[471,142,1249],[1041,1035,394],[1328,568,1104],[61,1100,1096],[154,1092,1088],[112,1042,1050],[154,187,168],[435,235,45],[1075,1096,1087],[97,1075,748],[1049,1066,1041],[816,1067,1028],[846,982,1142],[1245,96,284],[1092,154,1080],[1057,451,1063],[387,377,1051],[1055,1025,1047],[1075,1087,1089],[1106,1108,856],[1068,1034,404],[1480,1545,868],[906,135,1619],[1074,991,1095],[570,566,1061],[1025,453,1044],[745,1336,1107],[1035,1057,416],[1092,1102,1129],[1074,135,991],[1105,745,1107],[447,1026,446],[394,387,1041],[73,81,940],[1118,1108,1106],[1210,1108,874],[243,1022,906],[412,1064,1068],[1280,611,603],[960,447,1093],[1051,1039,1049],[1040,1109,1070],[1471,1037,1439],[69,890,443],[1377,703,1374],[1092,1080,1102],[1096,1100,788],[1096,788,1144],[1114,967,1111],[446,1026,297],[70,1112,883],[453,393,1057],[1118,874,1108],[1054,370,1045],[1080,1094,1102],[1039,1048,1049],[428,753,845],[1047,1044,1066],[1044,453,1035],[1472,731,1512],[1126,1121,743],[743,1121,1110],[1032,297,1054],[1480,868,1216],[71,358,72],[1133,967,1114],[1105,1119,745],[1035,453,1057],[1026,447,960],[454,851,1190],[1030,1477,652],[589,816,1028],[1110,1121,1106],[1122,1118,1106],[1116,874,1118],[1048,1055,1066],[1194,1067,816],[744,278,747],[745,1120,845],[845,1052,428],[1105,1780,1119],[1065,297,385],[1098,1529,1463],[731,1060,936],[235,434,812],[1445,1525,1117],[1106,1121,1122],[1122,1127,1118],[1127,1116,1118],[1094,118,1732],[1119,1120,745],[1406,1124,1097],[435,117,235],[1462,1440,1037],[1126,1129,1121],[1088,1092,1129],[1133,73,967],[1120,1052,845],[812,434,752],[1441,1559,1200],[1131,588,413],[1054,1065,370],[235,1098,434],[1052,1142,428],[1737,428,1142],[1496,1446,1483],[1182,1083,1654],[1121,1129,1122],[1732,1116,1127],[768,457,649],[761,1114,249],[1064,960,1068],[1135,1481,1136],[1126,952,1129],[1087,588,1131],[1087,1144,588],[859,788,1139],[1140,1133,1132],[1133,1140,73],[1822,570,1061],[394,1035,416],[1055,1023,459],[80,264,485],[1119,1128,1120],[145,1658,567],[695,891,768],[1129,1102,1122],[1122,1102,1127],[1416,1077,1413],[297,1026,385],[1052,846,1142],[1445,1117,1400],[952,1086,1129],[1714,1089,1131],[1131,1089,1087],[1100,1139,788],[112,1050,1062],[1323,354,1296],[49,333,1141],[1142,982,1737],[79,1457,1091],[1088,1129,1086],[1102,1094,1127],[1127,1094,1732],[1100,1082,1139],[1082,1132,1139],[1082,1140,1132],[1150,1043,397],[60,1166,289],[1696,1146,1698],[1297,1202,1313],[409,1297,1313],[1234,1194,420],[1408,1391,1394],[424,1235,1243],[1203,309,1148],[485,477,447],[1152,1156,850],[1153,1149,1155],[1153,1157,1149],[1149,1152,1150],[1156,1154,1151],[776,1153,1155],[1157,1152,1149],[1217,1393,1208],[1156,1159,1154],[1153,1165,1157],[1165,1152,1157],[1159,1020,1154],[1161,1153,776],[1161,1165,1153],[1165,1158,1152],[1152,1158,1156],[1158,1159,1156],[1166,776,561],[1160,1161,776],[1161,1164,1165],[1161,1160,1164],[1158,1162,1159],[1159,1162,1020],[1270,1321,971],[1164,1170,1165],[1165,1162,1158],[1162,1163,1020],[588,788,925],[1166,1167,1160],[1165,1170,1162],[1160,1167,1164],[1162,1170,1163],[1179,1167,1166],[1167,1168,1164],[1164,1168,1170],[1168,1169,1170],[1234,1022,288],[802,39,866],[1179,1168,1167],[1169,1173,1170],[1170,1173,1163],[1173,1185,1163],[1360,1267,1364],[1169,1185,1173],[611,244,243],[900,1226,1376],[1260,1408,1350],[618,840,831],[1181,1183,1179],[1179,1184,1168],[1208,1274,1291],[1183,1184,1179],[1168,1184,1169],[1387,1395,1254],[1208,1204,1172],[1182,1197,1083],[1187,1083,1197],[1213,1183,1181],[1169,1207,1185],[135,857,991],[1013,1213,1181],[1189,1183,1213],[1183,1189,1184],[1169,1184,1207],[1207,1190,1185],[1180,1389,1288],[1191,1192,1640],[1640,1192,1090],[1090,1205,1654],[1654,1205,1182],[1188,1395,1187],[1126,743,1733],[788,859,925],[809,1234,1171],[1193,1197,1182],[1189,1199,1184],[1639,1191,1637],[1639,1212,1191],[1205,1193,1182],[1198,1187,1197],[1199,1207,1184],[332,1053,846],[1090,1192,1205],[117,1188,1187],[435,1188,117],[435,1206,1188],[1199,1189,1213],[420,816,1053],[1212,1215,1191],[117,1187,1198],[45,1206,435],[120,1132,1133],[874,1116,1210],[1191,1215,1192],[1193,1216,1197],[1216,1198,1197],[1199,1214,1207],[117,521,235],[1220,1311,1078],[1220,900,1311],[1653,1215,1212],[1192,1225,1205],[1205,1209,1193],[1209,1216,1193],[1389,1217,1172],[1207,1214,454],[171,557,1747],[1805,1078,1787],[1805,1219,1078],[1198,1216,868],[666,910,854],[1230,1231,1213],[1213,1231,1199],[1199,1231,1214],[1219,1220,1078],[1215,1221,1192],[1192,1221,1225],[1225,1228,1205],[1205,1228,1209],[1209,1228,1216],[1464,1325,1223],[1215,1227,1221],[1228,1480,1216],[1226,1653,1376],[1653,1249,1215],[1221,1240,1225],[1225,1240,1228],[839,761,840],[1238,1219,1805],[1238,1220,1219],[1232,1380,1375],[1226,1249,1653],[1221,1227,1240],[233,207,532],[110,1236,1230],[1248,1231,1230],[1231,454,1214],[1249,1227,1215],[1248,1056,1231],[489,959,944],[448,1240,284],[925,859,1242],[1805,1244,1238],[1252,1220,1238],[1252,921,1220],[1236,1251,1230],[1230,1251,1248],[1056,993,1231],[1031,1264,1263],[68,1186,157],[1227,1245,1240],[1103,1245,143],[1243,1235,612],[1252,95,921],[1249,1226,1237],[1390,1387,1254],[1120,384,830],[830,332,846],[1227,143,1245],[1315,1369,1358],[1356,1269,1386],[972,795,489],[1831,1224,310],[1250,1255,1251],[1251,1056,1248],[1256,1243,103],[658,358,175],[1620,1238,1244],[1620,1252,1238],[1506,95,1252],[104,1249,1237],[1249,143,1227],[1268,1419,1329],[634,806,231],[618,831,815],[924,1242,839],[1255,1270,1251],[1251,1270,1056],[866,925,1242],[103,29,1256],[424,1243,1256],[134,1651,752],[1250,917,1255],[1172,1204,1260],[1352,1036,1276],[1265,1201,1329],[804,1282,1259],[1259,1294,723],[335,1330,1305],[407,762,799],[875,856,1195],[32,158,344],[967,944,749],[372,125,42],[1175,1354,1261],[553,612,1235],[1259,1273,1294],[1294,1283,723],[757,78,158],[407,799,798],[901,51,52],[139,1386,1389],[1386,1269,1389],[1389,1269,1217],[1148,1590,1268],[1428,1449,1450],[804,1281,1282],[1273,1259,1282],[158,399,779],[771,407,798],[521,1098,235],[917,1312,1255],[1312,1270,1255],[1217,1269,1393],[1195,1108,634],[1110,1106,856],[1210,1691,1176],[27,1112,1145],[1296,27,1145],[1171,858,791],[704,1148,1290],[1430,1436,1437],[1282,1308,1273],[1300,943,1283],[1393,1355,1274],[720,1278,769],[1287,1059,1399],[1310,1388,1272],[1312,1321,1270],[851,1185,1190],[1296,1145,1304],[26,24,771],[51,910,631],[1329,1290,1268],[1290,1148,1268],[1298,1293,733],[1281,1293,1282],[1282,1293,1308],[1308,1299,1273],[1300,1283,1294],[1340,943,1300],[1340,1301,943],[407,754,762],[1287,1399,1295],[34,139,128],[1288,1172,1260],[120,1133,1114],[1306,1113,1511],[1464,1223,1292],[1299,1294,1273],[1299,1300,1294],[1286,1295,838],[1285,1247,1286],[1247,713,1286],[1201,1265,1390],[1378,1368,1357],[1482,1320,917],[917,1320,1312],[850,1156,1151],[588,39,413],[1324,1306,686],[789,1365,928],[1223,1326,1292],[1292,1326,1298],[869,1097,1311],[790,786,561],[1323,1304,932],[1323,1296,1304],[1317,1324,686],[1306,368,1113],[1325,1342,1223],[1326,1348,1298],[1293,1327,1308],[1308,1318,1299],[704,1290,1258],[1320,1321,1312],[761,120,1114],[1684,802,866],[1674,6,1727],[1316,1323,932],[1335,1337,1305],[1348,1327,1293],[1298,1348,1293],[1333,1300,1299],[1333,1343,1300],[1328,1301,1340],[1328,1314,1301],[838,1399,1319],[921,1237,900],[409,1391,1408],[1376,1653,677],[1281,804,1458],[1331,1324,1317],[1324,368,1306],[368,1338,1307],[1327,797,1308],[797,1345,1308],[1308,1345,1318],[1318,1333,1299],[1341,1147,1572],[923,1321,1320],[923,920,1321],[39,588,866],[1141,1323,1316],[1330,1335,1305],[1337,1335,1336],[1339,1332,1325],[1223,1342,1326],[1342,1348,1326],[1348,797,1327],[1345,1333,1318],[1343,1340,1300],[1419,1265,1329],[1347,1320,1584],[1535,1141,1316],[1078,1311,582],[1344,1335,1330],[753,1331,1337],[368,1324,1331],[753,368,1331],[1332,1485,1325],[1325,1485,1342],[787,1343,1333],[137,1328,1340],[973,1341,1479],[406,1147,1341],[1171,1234,858],[1141,1535,1322],[49,1141,1322],[1344,1336,1335],[973,908,1341],[766,1347,1584],[1347,923,1320],[781,49,1322],[368,232,1338],[787,1340,1343],[787,137,1340],[568,1346,973],[58,1147,406],[442,1334,1147],[58,442,1147],[442,766,1334],[90,923,1347],[428,368,753],[779,1333,1345],[825,787,1333],[137,1349,1328],[1328,1346,568],[908,406,1341],[924,866,1242],[1336,753,1337],[428,232,368],[1115,777,1098],[1348,28,797],[797,779,1345],[779,825,1333],[1007,908,973],[583,1351,880],[1365,1246,977],[1658,145,1710],[1310,796,1388],[718,245,165],[1302,1272,1254],[1174,1351,583],[1174,715,1351],[1358,1260,1204],[1374,1373,1276],[1377,1374,1276],[678,1362,1382],[1377,1276,254],[139,34,40],[1008,1174,583],[1396,1286,1319],[768,891,457],[1316,932,1535],[1289,1371,1360],[182,736,864],[1355,1364,1274],[860,1367,1354],[1362,1222,1382],[1376,869,1311],[1590,1411,198],[1232,1375,877],[1394,1295,1286],[880,1356,1386],[880,1351,1356],[1211,1059,1287],[197,678,1405],[880,1386,1003],[1368,1253,1357],[1357,1253,1036],[715,1289,1364],[1354,1367,703],[1383,877,1375],[1266,1288,1260],[1373,1374,703],[1372,1289,1174],[1303,1366,1378],[1351,715,1355],[1665,1666,624],[1309,1357,1036],[900,1237,1226],[1174,1289,715],[1337,1331,1317],[1360,1303,1359],[1267,1354,1175],[1241,1284,1414],[1377,254,929],[1385,855,836],[1396,1319,1436],[1361,1366,1303],[1381,1368,1378],[1313,1211,1391],[1368,1385,1363],[813,82,861],[1058,1280,807],[893,519,892],[1359,1303,860],[1382,1350,1247],[1371,1303,1360],[1267,1175,1271],[769,1286,1396],[712,1837,82],[1366,1385,1381],[1365,796,1310],[1003,1386,40],[780,1371,1370],[561,862,790],[1284,1380,864],[1449,1428,177],[611,1280,1058],[1284,1375,1380],[926,506,1241],[1305,1337,1317],[309,1203,208],[1388,1201,1390],[1309,1036,1352],[1377,929,1411],[1399,1059,1257],[1112,70,1145],[289,1166,561],[1288,1389,1172],[1362,37,1180],[713,1394,1286],[1355,1393,1269],[1401,1423,941],[1274,1271,1384],[860,1378,1367],[715,1364,1355],[677,1406,869],[1297,1358,1202],[1388,1258,1329],[1180,1288,1266],[1008,583,880],[1524,1425,1463],[1390,1403,1387],[1278,1379,1247],[1278,1247,1285],[964,1278,1262],[1358,1369,1202],[1715,1699,1726],[926,1241,1414],[1341,1572,1479],[926,930,916],[1397,51,781],[409,1358,1297],[1236,436,301],[1376,677,869],[1351,1355,1356],[758,1534,1523],[1378,1357,1367],[977,1211,1365],[1135,1136,854],[1394,1391,1295],[1266,1260,1222],[1365,1302,1246],[1232,877,844],[736,930,864],[1408,1358,409],[1508,817,1523],[1381,1385,1368],[718,854,910],[854,718,1135],[1382,1222,1350],[1391,1211,1287],[1391,1287,1295],[1257,1651,134],[1414,1284,864],[1291,1369,1315],[1202,928,1313],[86,1400,1413],[1413,1200,86],[1263,1625,1031],[1413,1400,1404],[1002,1664,1834],[930,926,1414],[1399,1257,134],[520,316,596],[1393,1274,1208],[1657,1655,1712],[1407,1404,1400],[1404,1410,1413],[1649,1229,1406],[1362,1266,1222],[1384,1271,1175],[900,1376,1311],[1274,1384,1291],[1291,1384,1431],[1433,1396,1436],[1267,1359,1354],[309,1353,703],[838,1319,1286],[1407,1410,1404],[441,1518,773],[1241,123,1428],[1622,1521,1224],[1217,1208,1172],[1130,793,1076],[425,1409,1481],[1481,1409,1533],[1303,1378,860],[1350,1408,1394],[1246,1651,977],[1289,1360,1364],[1727,1694,1623],[1417,1407,1533],[1417,1410,1407],[1406,1650,1649],[1319,134,1437],[1414,864,930],[1406,1229,1124],[1354,1359,860],[1433,769,1396],[1417,1533,1409],[1416,1413,1410],[1415,1416,1410],[95,1237,921],[1392,1254,1395],[1360,1359,1267],[1258,1290,1329],[1180,128,1389],[1420,1409,425],[1417,1418,1410],[1418,1415,1410],[1422,1077,1416],[1247,1350,1394],[37,43,1180],[1204,1315,1358],[1428,1383,1375],[1356,1355,1269],[1409,1418,1417],[1302,45,1246],[1421,1416,1415],[1421,1422,1416],[1422,1494,1077],[957,720,938],[1423,1409,1420],[1423,1418,1409],[752,434,1438],[1260,1358,1408],[1363,1385,785],[1423,1426,1418],[1426,1424,1418],[1229,1649,1124],[1222,1260,1350],[1508,1523,1137],[1278,1285,769],[1482,917,144],[1418,1424,1415],[1425,1422,1421],[1425,1524,1422],[1272,1388,1390],[1391,409,1313],[1378,1366,1381],[1371,483,1361],[720,1262,1278],[29,103,159],[1271,1364,1267],[1424,1427,1415],[1537,1522,1518],[134,752,1438],[1420,934,941],[1428,1375,1284],[1277,1224,1831],[1362,1180,1266],[1401,1426,1423],[1577,1369,1291],[268,483,262],[1383,1450,1456],[1384,1175,1431],[1430,1415,1427],[1430,1421,1415],[1430,1425,1421],[1379,1382,1247],[1252,1553,1429],[1206,1392,1395],[1433,1430,1427],[309,208,1353],[1272,1390,1254],[1361,483,1366],[1523,817,808],[1302,1254,1392],[1371,1361,1303],[1426,1435,1424],[1435,1433,1424],[1433,1427,1424],[720,769,1433],[796,1258,1388],[1590,1419,1268],[1289,1372,1371],[1305,1317,1509],[998,1372,1174],[40,1386,139],[1261,1354,703],[1364,1271,1274],[134,1438,1437],[1436,1319,1437],[1317,686,1509],[1484,932,1304],[1434,1432,1509],[1420,65,934],[931,930,736],[1367,1357,1309],[1372,1370,1371],[1204,1208,1315],[1426,938,1435],[1368,1363,1253],[1207,454,1190],[1302,1310,1272],[309,1377,390],[390,1377,1411],[1370,1372,998],[1411,1590,1148],[720,1433,1435],[1450,1383,1428],[1379,678,1382],[1405,678,1379],[1208,1291,1315],[1399,134,1319],[1367,1309,1373],[1373,1352,1276],[596,741,593],[553,1264,612],[1433,1436,1430],[1437,1438,1430],[964,1405,1379],[1373,1309,1352],[1265,1403,1390],[1233,1618,1434],[1365,1310,1302],[789,796,1365],[720,1435,938],[128,139,1389],[1466,933,1525],[1191,1640,1637],[1314,1442,943],[1141,353,1323],[1489,1138,1474],[1462,1477,1440],[1474,1138,1488],[1442,1314,1443],[1446,1030,1546],[1484,1145,697],[1549,1443,1445],[1470,1572,1468],[1397,1239,1507],[1649,1825,1824],[1259,1440,1477],[1451,1450,1449],[978,1446,652],[1454,1456,1451],[1451,1456,1450],[341,1507,595],[933,1547,79],[804,1452,1060],[1454,1455,1456],[1398,1460,1454],[1455,877,1456],[1277,1831,1825],[804,1060,1458],[1339,1459,1595],[1314,1104,1443],[933,1448,1547],[147,1460,1398],[1460,1461,1454],[1454,1461,1455],[1292,1125,1464],[417,1531,1480],[1459,1339,1325],[811,1756,335],[1512,936,1490],[777,1529,1098],[147,1475,1460],[1464,253,1459],[836,855,482],[1487,1486,1307],[1104,1501,1443],[1439,1200,1532],[1475,1469,1460],[1460,1469,1461],[1325,1464,1459],[1277,1825,1649],[1532,1200,1077],[844,877,1455],[1572,933,1466],[1479,568,973],[1509,335,1305],[1339,1595,1759],[1469,1476,1461],[1461,1476,1455],[1104,1470,1468],[1464,1472,253],[1117,1091,1407],[1756,1542,335],[1206,1395,1188],[335,1542,1330],[835,844,1455],[1471,1598,1462],[1491,1442,1441],[835,1455,1476],[1441,1442,1443],[1489,1474,1473],[1251,1236,1250],[1030,1452,1477],[1598,1439,1532],[978,1598,1492],[1426,1401,938],[1448,1584,1482],[1724,1497,1475],[1475,1497,1469],[1484,1535,932],[1307,1486,1113],[1487,696,1495],[1037,1491,1441],[1030,1446,936],[1453,1487,1495],[696,1467,1495],[1138,1489,1483],[1497,1143,1469],[1469,1143,1476],[652,1598,978],[850,1043,1150],[1482,1584,1320],[1731,98,1697],[1113,1554,1573],[1524,1532,1494],[1496,1467,696],[1452,1259,1477],[296,1504,1497],[1504,1143,1497],[1143,1499,1476],[718,910,1498],[868,1540,1528],[817,1253,810],[1490,696,1487],[1440,1491,1037],[1510,676,595],[1488,1492,1517],[781,1239,1397],[1467,1519,1503],[1500,1307,1759],[1149,397,452],[1504,1514,1143],[1514,842,1143],[1125,733,1458],[1503,1531,1555],[1276,1036,1137],[1440,723,1123],[1036,1508,1137],[817,1508,1253],[103,883,1112],[1458,731,1472],[1512,1490,1487],[1487,1453,1486],[1138,978,1488],[1036,1253,1508],[1398,149,147],[1474,1517,1513],[1125,1458,1472],[1486,1453,1554],[1518,1534,758],[345,1058,1062],[928,1202,1369],[1554,1541,1505],[1464,1125,1472],[1504,764,1514],[304,426,573],[1505,742,1506],[1479,1572,1478],[1519,1483,1489],[833,716,1069],[1522,1534,1518],[1115,1513,777],[811,335,1432],[1591,1533,1407],[777,1517,1529],[1513,1517,777],[1498,910,1397],[1069,1539,833],[833,1539,1537],[1522,1551,1534],[1534,1551,1523],[1538,1137,1523],[910,51,1397],[1367,1373,703],[1466,1525,1468],[157,1186,1832],[1429,1511,1506],[1573,1505,1506],[1259,1452,804],[1503,1495,1467],[262,483,780],[1572,1466,1468],[1536,1556,716],[716,1556,1069],[1544,1523,1551],[1544,1538,1523],[1511,1573,1506],[933,1572,1448],[1543,1537,1539],[1537,1543,1522],[1091,933,79],[1519,1540,1545],[1549,1445,86],[1069,1548,1539],[1548,1543,1539],[1543,1551,1522],[1500,1487,1307],[68,784,1186],[1552,1544,1551],[1550,1538,1544],[1538,1550,1137],[1519,1473,1540],[1547,1448,1482],[1560,1563,1536],[1536,1563,1556],[1556,1548,1069],[1543,1558,1551],[1137,1550,1276],[1453,1495,1555],[1561,1543,1548],[1543,1561,1558],[1558,1566,1551],[1552,1550,1544],[1569,1557,1550],[1557,1276,1550],[1276,1557,254],[1531,1503,1480],[1535,1530,1510],[1545,1503,1519],[1547,1482,79],[1566,1552,1551],[1552,1569,1550],[1503,1545,1480],[703,1377,309],[1625,675,756],[1037,1441,88],[929,254,1557],[849,1567,1560],[1556,1564,1548],[1492,1529,1517],[1252,1429,1506],[1553,1027,1429],[1453,1555,1541],[1554,1453,1541],[1233,686,1553],[1328,1104,1314],[1564,1576,1548],[1548,1576,1561],[1557,1562,929],[1520,112,1668],[1483,1446,1138],[778,1570,1567],[1563,1564,1556],[1561,1565,1558],[1565,1566,1558],[1569,1552,1566],[1562,1557,1569],[1530,1535,1484],[1387,1402,1395],[1621,1634,1387],[1567,1568,1560],[1560,1568,1563],[1571,1569,1566],[1344,1330,1542],[1577,1431,1353],[1638,233,304],[1524,1463,1529],[1353,1431,1175],[1077,1200,1413],[1478,1470,1104],[1568,1575,1563],[1563,1575,1564],[1575,1576,1564],[1561,1576,1565],[1565,1574,1566],[1562,1515,929],[1555,96,1541],[1531,417,96],[1555,1531,96],[1246,45,1651],[208,1577,1353],[1586,1568,1567],[1574,1571,1566],[1571,1583,1569],[1474,1513,1528],[1239,1322,1535],[1478,1572,1470],[1570,1586,1567],[1488,1517,1474],[8,1833,1837],[1123,1442,1491],[1589,1568,1586],[1576,1594,1565],[1565,1594,1574],[1562,198,1515],[1559,1441,1549],[1441,1443,1549],[1135,425,1481],[1239,1535,1507],[1595,1487,1500],[1570,1585,1586],[1589,1578,1568],[1568,1578,1575],[1579,1569,1583],[1177,1577,208],[115,1236,110],[1578,1593,1575],[1587,1576,1575],[1576,1581,1594],[1571,1582,1583],[1588,1579,1583],[1579,1580,1562],[1569,1579,1562],[1562,1580,198],[1027,1511,1429],[1589,1593,1578],[1587,1581,1576],[1582,1574,1594],[1574,1582,1571],[1575,1593,1587],[1583,1582,1588],[1580,1590,198],[1587,1593,1581],[1505,1541,96],[1369,1577,1177],[1573,1554,1505],[1479,1478,568],[1585,1589,1586],[1369,1177,704],[766,1584,1334],[977,1257,1059],[1091,1591,1407],[1591,1091,1457],[1585,1604,1589],[1581,1592,1594],[1602,1582,1594],[1582,1608,1588],[1608,1579,1588],[1579,1597,1580],[1419,1590,1580],[1597,1419,1580],[1431,1577,1291],[1589,1604,1593],[1601,1596,1593],[1593,1596,1581],[1306,1511,1027],[1511,1113,1573],[1786,1412,1585],[1412,1604,1585],[1581,1596,1592],[1592,1602,1594],[1608,1599,1579],[1599,1611,1579],[1579,1611,1597],[1512,1487,253],[1519,1489,1473],[1545,1540,868],[1083,1187,1402],[1117,1407,1400],[1292,733,1125],[284,1240,1245],[1604,1600,1593],[1600,1601,1593],[1582,1607,1608],[789,1369,704],[1467,1483,1519],[1601,1613,1596],[1596,1613,1592],[1602,1607,1582],[1620,1553,1252],[1601,1605,1613],[1592,1613,1602],[1602,1606,1607],[1608,1609,1599],[1599,1609,1611],[1603,1597,1611],[1265,1419,1597],[1603,1265,1597],[1392,1206,45],[928,1369,789],[1474,1528,1473],[1104,1468,1501],[1412,1521,1604],[1613,1631,1602],[1607,1610,1608],[1608,1610,1609],[1476,863,835],[1495,1503,1555],[1498,1397,718],[1520,1668,7],[1604,1615,1600],[1605,1601,1600],[1602,1631,1606],[1606,1610,1607],[1759,1595,1500],[1292,1298,733],[1615,1604,1521],[1609,1603,1611],[652,1462,1598],[1468,1525,1445],[1443,1501,1445],[1134,1723,150],[1521,1622,1615],[1615,1616,1600],[1616,1605,1600],[1605,1616,1612],[1605,1612,1613],[1612,1617,1613],[1613,1617,1631],[1606,1614,1610],[1265,1603,1403],[448,417,1480],[1595,253,1487],[1501,1468,1445],[1383,1456,877],[1490,1496,696],[1610,1627,1609],[1627,1621,1609],[1591,1481,1533],[1598,1471,1439],[1353,1261,703],[1606,1631,1614],[1609,1621,1403],[1532,1077,1494],[1528,1115,513],[1546,652,1446],[1211,928,1365],[1540,1473,1528],[1078,1502,1787],[1425,1430,1438],[1617,1630,1631],[959,749,944],[566,570,603],[1716,310,1521],[775,452,397],[1615,1636,1616],[1616,1636,1612],[1610,1632,1627],[789,704,1258],[1457,1481,1591],[1769,1756,811],[207,1629,722],[1629,1625,722],[1224,1277,1622],[1622,1636,1615],[1636,1646,1612],[1612,1630,1617],[1631,1626,1614],[1614,1632,1610],[1506,104,95],[1481,1457,1136],[1123,943,1442],[936,1446,1496],[1499,863,1476],[1629,1031,1625],[1233,1509,686],[1633,1634,1621],[1621,1387,1403],[1472,1512,253],[1177,208,704],[1277,1636,1622],[1626,1632,1614],[1627,1633,1621],[936,1496,1490],[185,1454,1451],[731,936,1512],[1638,1635,207],[553,1263,1264],[1653,1212,1639],[1633,1627,1632],[1633,1387,1634],[1458,1060,731],[368,1307,1113],[1264,1031,1629],[1152,850,1150],[1277,1644,1636],[1646,1637,1612],[1637,1630,1612],[1647,1631,1630],[1647,1626,1631],[1422,1524,1494],[1030,652,1546],[1635,1629,207],[1635,1264,1629],[1639,1646,1636],[1637,1640,1630],[1641,1632,1626],[1632,1642,1633],[1633,1643,1387],[842,1499,1143],[865,863,1499],[1516,978,1492],[67,1130,784],[1103,1505,96],[88,1441,1200],[1644,1639,1636],[1640,1647,1630],[1647,1641,1626],[1633,1648,1643],[1492,1532,1524],[1488,1516,1492],[1037,1471,1462],[612,1264,1635],[1502,1078,1124],[1641,1642,1632],[1648,1633,1642],[1528,513,868],[1492,1598,1532],[1095,991,760],[679,157,1664],[760,1128,1785],[1277,1650,1644],[320,1022,244],[1559,1549,86],[1676,1520,7],[1488,978,1516],[1095,760,1785],[1128,384,1120],[304,312,1638],[1081,1638,312],[1081,1635,1638],[103,612,1635],[652,1477,1462],[1650,1645,1644],[1645,1639,1644],[1639,1637,1646],[1640,1090,1647],[1654,1641,1647],[1654,1642,1641],[1654,1648,1642],[1643,1402,1387],[1432,335,1509],[384,1128,760],[1652,312,304],[103,1243,612],[1277,1649,1650],[1090,1654,1647],[1643,1648,1402],[1134,324,1675],[679,68,157],[1652,1081,312],[1136,301,803],[1653,1639,1645],[723,1440,1259],[803,854,1136],[104,1506,742],[1112,159,103],[1654,1083,1648],[977,1651,1257],[1397,1507,718],[1081,103,1635],[1650,677,1645],[1083,1402,1648],[1706,1655,1671],[1624,1704,1711],[767,2,1],[608,794,294],[1678,1683,1686],[767,1682,2],[1669,1692,1675],[296,1681,764],[1671,1656,1672],[17,1673,1679],[1706,1671,1673],[1662,1674,1699],[1655,1657,1656],[418,84,915],[1526,1514,764],[1658,1657,567],[870,1695,764],[813,1697,98],[1659,821,5],[60,1013,848],[1013,110,1213],[661,1038,1692],[1660,1703,17],[1693,1673,17],[1663,1715,1743],[1013,115,110],[344,1733,32],[1670,1663,1743],[1670,1743,1738],[1677,1670,1738],[1661,4,3],[1084,1683,1678],[1728,793,1130],[1683,1767,1196],[1677,1738,1196],[1279,1786,853],[294,1038,608],[1279,1689,1786],[870,18,1708],[870,1680,1695],[1705,10,1670],[1084,1767,1683],[1196,1738,1686],[1750,870,1681],[1750,18,870],[1773,1703,1660],[1135,47,425],[150,323,1134],[1707,1655,1706],[1741,344,1687],[1685,1691,1684],[1684,1691,802],[1672,1656,0],[1038,124,608],[1671,1672,1690],[1628,1218,1767],[1686,1275,1667],[1493,1750,1681],[1773,18,1750],[1773,1660,18],[1679,1671,16],[1735,1706,1673],[1667,1678,1686],[1688,1658,1],[1656,1688,0],[1293,1281,1458],[1698,1678,1667],[1696,1130,1722],[1698,1667,1696],[1715,1662,1699],[1692,1038,294],[1682,767,357],[1669,661,1692],[802,1702,824],[1028,1067,1784],[822,1624,778],[119,813,861],[1218,1670,1677],[1703,1693,17],[1658,1710,1],[750,1730,1729],[1701,750,1729],[1693,1735,1673],[1731,1694,98],[1691,1702,802],[783,1729,1719],[1680,870,1708],[1707,1709,1655],[533,756,675],[1691,1210,1702],[11,1705,1670],[1767,1218,1196],[1218,1677,1196],[1664,1716,1721],[1729,1725,1719],[1729,1072,1725],[1210,1116,1702],[1702,1720,824],[1682,1661,2],[1713,1719,1721],[1716,1786,1713],[1730,1722,1072],[294,1717,1811],[1692,294,1666],[1659,680,821],[824,1720,1714],[1726,1731,1718],[345,1062,1045],[1738,1743,1275],[1075,1089,1071],[783,1719,1689],[1275,684,1728],[1692,1666,1665],[1675,1692,1665],[294,1811,1666],[1716,1664,310],[1678,1698,1700],[6,9,1727],[676,649,595],[381,31,361],[1723,1804,1772],[1727,9,1694],[1720,1089,1714],[1786,1716,1412],[1683,1196,1686],[1718,1697,1085],[1116,1739,1702],[1739,1734,1720],[1702,1739,1720],[1089,1720,1734],[509,748,1745],[1743,1715,1726],[1717,294,794],[1116,1732,1739],[1718,1731,1697],[1696,1667,1130],[1134,1665,1723],[1694,712,98],[101,1687,102],[391,1736,101],[662,636,642],[1734,1447,1089],[1089,1447,1071],[436,99,493],[1689,1279,783],[1485,1465,1342],[1736,1687,101],[344,1741,1733],[1741,1742,1733],[1735,829,1706],[829,1707,1706],[1485,1332,1465],[952,1126,1742],[1747,1447,1734],[879,892,645],[1730,1146,1696],[829,1709,1707],[1709,1712,1655],[118,1739,1732],[1332,1744,1465],[1687,1749,1741],[1741,1758,1742],[679,1072,68],[1072,1722,68],[118,1747,1739],[1747,1734,1739],[1465,1744,1736],[1736,1740,1687],[1704,1701,783],[1665,624,1723],[1722,1130,67],[1025,1055,467],[1444,14,1701],[558,522,530],[1657,1658,1688],[1339,1746,1332],[1332,1748,1744],[1687,1740,1749],[1741,1749,1758],[1109,952,1742],[1747,118,141],[1671,1690,1628],[1671,1628,16],[1657,1688,1656],[1745,748,1447],[357,767,1710],[1746,1748,1332],[1146,1700,1698],[1759,1307,1338],[1239,781,1322],[1745,1447,1747],[522,1745,1747],[316,717,595],[148,1493,1724],[1758,1109,1742],[1725,1072,679],[726,719,1661],[1695,1680,1526],[1772,1750,1493],[148,1772,1493],[1542,1751,1101],[952,1109,1086],[1744,1752,1736],[1736,1752,1740],[1753,1755,1740],[391,1342,1736],[821,112,1520],[557,530,1747],[530,522,1747],[994,879,645],[1542,1756,1751],[1813,1693,1703],[1746,1754,1748],[1748,1764,1744],[1752,1757,1740],[1740,1757,1753],[1749,1740,1755],[1755,1763,1749],[1763,1758,1749],[1275,1743,684],[1813,1735,1693],[1107,1099,1101],[1723,624,1804],[1403,1603,1609],[1748,1754,1764],[1744,1757,1752],[1760,1109,1758],[1465,1736,1342],[436,115,99],[1686,1738,1275],[1751,1766,1101],[1759,1754,1746],[1755,1753,1763],[1570,1279,853],[1701,1146,750],[1655,1656,1671],[11,1670,1218],[1761,1751,1756],[1766,1107,1101],[1726,1623,1731],[1711,1704,1279],[67,784,68],[558,530,545],[1620,1618,1233],[1769,1761,1756],[102,1687,344],[1338,1754,1759],[1754,232,1764],[1744,1765,1757],[1757,1763,1753],[1762,1760,1758],[1760,1771,1109],[1339,1759,1746],[1675,1665,1134],[1730,1696,1722],[1774,1751,1761],[1766,1780,1107],[1780,1105,1107],[1764,1765,1744],[1763,1762,1758],[1772,1773,1750],[1811,1813,1703],[1434,1769,1432],[1780,1766,1751],[232,1781,1764],[1711,1279,1570],[1688,1,0],[1774,1780,1751],[1764,1781,1765],[1765,1768,1757],[1757,1768,1763],[1777,1782,1760],[1762,1777,1760],[1769,1774,1761],[1763,1777,1762],[1760,1782,1771],[232,1737,1781],[1768,1776,1763],[272,255,774],[1669,994,661],[1618,1769,1434],[1765,589,1768],[1770,1777,1763],[1701,1729,783],[1783,1774,1769],[1789,1780,1774],[589,1775,1768],[1776,1770,1763],[1782,1778,1771],[1771,1778,1070],[624,1703,1773],[624,1811,1703],[1620,1244,1618],[1779,1769,1618],[1779,1783,1769],[739,1735,1813],[1775,1776,1768],[1790,1777,1770],[1777,1778,1782],[1725,679,1721],[733,1293,1458],[1802,1618,1244],[1802,1779,1618],[1788,1783,1779],[1789,1774,1783],[1796,1780,1789],[1796,1119,1780],[1823,1817,325],[1699,1727,1623],[750,1146,1730],[1497,1724,296],[1128,1119,1796],[61,62,71],[1131,413,824],[1114,1111,249],[1784,1776,1775],[1123,723,1283],[1791,1788,1779],[1788,1789,1783],[1095,1797,1074],[1028,1784,1775],[1784,1770,1776],[1777,1790,1778],[1793,1797,1095],[1797,1800,1074],[1798,1790,1770],[1805,1802,1244],[1802,1791,1779],[1792,1789,1788],[1793,1785,1128],[1793,1095,1785],[1074,1800,1619],[741,457,593],[1798,1770,1784],[1798,1794,1790],[1786,1689,1713],[684,1726,1718],[1728,1085,793],[1795,1787,1502],[1806,1802,1805],[1819,1788,1791],[1067,1798,1784],[1790,1794,1778],[1795,1502,1124],[1801,1805,1787],[1807,1791,1802],[1807,1819,1791],[1819,1792,1788],[1799,1128,1796],[994,645,661],[684,1085,1728],[684,1718,1085],[1699,1623,1726],[1801,1787,1795],[1808,1789,1792],[1808,1796,1789],[1799,1793,1128],[1809,1797,1793],[1809,1803,1797],[1803,1800,1797],[1067,1794,1798],[774,255,1778],[1673,1671,1679],[879,1669,888],[19,1807,1802],[1810,1619,1800],[879,994,1669],[1794,774,1778],[1723,1772,148],[1804,1773,1772],[1814,1795,1124],[1649,1814,1124],[1814,1801,1795],[1812,1806,1805],[19,1802,1806],[19,1819,1807],[1810,1800,1803],[1804,624,1773],[1714,1131,824],[1801,1812,1805],[1812,19,1806],[1808,1792,1819],[1799,1809,1793],[1821,1810,1803],[1717,739,1813],[1061,1619,1822],[1794,1817,774],[79,1482,144],[1815,1801,1814],[23,1819,19],[589,1028,1775],[1817,1823,774],[1689,1719,1713],[1824,1814,1649],[1827,1818,1801],[1818,1812,1801],[1818,19,1812],[1818,20,19],[1816,1809,1799],[1821,1803,1809],[1822,1619,1810],[124,708,608],[1663,10,1715],[1815,1827,1801],[1820,1808,1819],[23,1820,1819],[603,1810,1821],[603,1822,1810],[1085,1697,793],[1628,1690,11],[1527,1704,1624],[1730,1072,1729],[1526,1444,1704],[1526,1680,1444],[1704,1444,1701],[1816,1821,1809],[1722,67,68],[317,272,1823],[1716,1713,1721],[16,1628,1767],[1527,1526,1704],[1824,1826,1814],[1814,1826,1815],[1818,21,20],[1835,1808,1820],[603,570,1822],[226,1070,1778],[1013,1181,1179],[1721,679,1664],[1717,1813,1811],[1828,1827,1815],[22,1820,23],[22,1835,1820],[1830,603,1821],[719,1659,5],[643,567,1657],[1717,794,739],[1825,1826,1824],[1828,1815,1826],[1829,21,1818],[1808,1835,13],[4,719,5],[10,1662,1715],[1828,1832,1827],[1832,1818,1827],[12,1833,1816],[1833,1821,1816],[1833,1830,1821],[14,1146,1701],[1186,1829,1818],[1280,603,1830],[14,1700,1146],[1667,1728,1130],[1825,1834,1826],[1834,1828,1826],[1832,1186,1818],[1836,13,1835],[1624,1711,1570],[778,1624,1570],[1719,1725,1721],[1002,1825,1831],[1002,1834,1825],[1834,1832,1828],[1186,21,1829],[1836,1835,22],[1837,1833,12],[1280,1830,1833],[1667,1275,1728],[16,1767,1084],[589,1765,1838],[1765,1781,1838],[1781,1737,1838],[1737,982,1838],[982,1053,1838],[1053,816,1838],[816,589,1838]]}\n"
  },
  {
    "path": "Resources/models/bunny.obj",
    "content": "vn -0.200975 -0.952175 -0.230156\nv 1.301895 0.122622 2.550061   \nvn -0.043332 -0.999056 -0.003240\nv 1.045326 0.139058 2.835156   \nvn -0.001337 -0.997372 -0.072444\nv 0.569251 0.155925 2.805125   \nvn -0.049713 -0.965426 -0.255895\nv 0.251886 0.144145 2.829280   \nvn -0.053499 -0.995000 -0.084340\nv 0.063033 0.131726 3.014080   \nvn 0.027065 -0.998651 -0.044315\nv -0.277753 0.135892 3.107160   \nvn 0.148004 -0.960993 -0.233639\nv -0.441048 0.277064 2.594331   \nvn 0.159966 -0.984614 -0.070331\nv -1.010956 0.095285 2.668983   \nvn 0.071092 -0.997266 0.020150\nv -1.317639 0.069897 2.325448   \nvn 0.269003 -0.959370 -0.085129\nv -0.751691 0.264681 2.381496   \nvn -0.013196 -0.978490 -0.205871\nv 0.684137 0.311340 2.364574   \nvn -0.186009 -0.965390 -0.182818\nv 1.347931 0.302882 2.201434   \nvn 0.049395 -0.998499 -0.023662\nv -1.736903 0.029894 1.724111   \nvn -0.017540 -0.996002 0.087588\nv -1.319986 0.119980 0.912925   \nvn -0.092201 -0.994239 -0.054662\nv 1.538077 0.157372 0.481711   \nvn 0.032483 -0.999454 0.006072\nv 1.951975 0.081742 1.164100   \nvn -0.120606 -0.988645 0.089644\nv 1.834768 0.095832 1.602682   \nvn 0.072319 -0.997074 0.024785\nv 2.446122 0.091817 1.375580   \nvn 0.018469 -0.999820 0.004384\nv 2.617615 0.078644 0.742801   \nvn 0.262943 -0.964617 -0.019357\nv -1.609748 0.049730 -0.238721   \nvn 0.368989 -0.928156 -0.048713\nv -1.281973 0.230984 -0.180916   \nvn 0.217717 -0.961579 -0.167229\nv -1.074501 0.248204 0.034007   \nvn 0.281197 -0.942722 -0.179453\nv -1.201734 0.058499 0.402234   \nvn 0.246500 -0.956509 -0.155972\nv -1.444454 0.054783 0.149579   \nvn -0.872318 -0.486770 -0.046007\nv -4.694605 5.075882 1.043427   \nvn -0.384341 0.906747 -0.173468\nv -3.959630 7.767394 0.758447   \nvn -0.887803 -0.344321 -0.305366\nv -4.753339 5.339817 0.665061   \nvn -0.535062 0.841353 -0.076380\nv -1.150325 9.133327 -0.368552   \nvn -0.851355 -0.475491 -0.221591\nv -4.316107 2.893611 0.443990   \nvn -0.078329 0.888081 0.452964\nv -0.809202 9.312575 -0.466061   \nvn -0.318312 0.880714 0.350743\nv 0.085626 5.963693 1.685666   \nvn -0.292307 0.831604 0.472220\nv -1.314853 9.001420 -0.133900   \nvn -0.893981 -0.421819 0.151216\nv -4.364182 3.072556 1.436712   \nvn 0.847431 -0.208555 0.488228\nv -2.022074 7.323396 0.678657   \nvn 0.312173 0.943481 -0.111315\nv 1.990887 6.130230 0.479643   \nvn -0.001399 0.997327 0.073050\nv -3.295525 7.878917 1.409353   \nvn -0.168930 0.978782 -0.115971\nv 0.571308 6.197569 0.670657   \nvn -0.123565 0.974559 -0.186991\nv 0.896610 6.200180 0.337056   \nvn -0.233218 0.966706 0.105301\nv 0.331851 6.162372 1.186371   \nvn -0.986641 -0.160688 -0.026800\nv -4.840066 5.599874 2.296069   \nvn 0.358606 0.899663 -0.249016\nv 2.138989 6.031291 0.228335   \nvn -0.180218 0.886057 0.427112\nv 0.678923 6.026173 1.894052   \nvn -0.034322 0.804829 0.592514\nv -0.781682 5.601573 1.836738   \nvn -0.034523 0.977652 -0.207375\nv 1.181315 6.239007 0.393293   \nvn 0.053070 0.726589 0.685019\nv -3.606308 7.376476 2.661452   \nvn -0.269834 0.468494 -0.841251\nv -0.579059 4.042511 -1.540883   \nvn 0.802164 0.556025 0.217645\nv -3.064069 8.630253 -2.597539   \nvn 0.866246 -0.042428 -0.497814\nv -2.157271 6.837012 0.300191   \nvn 0.993719 -0.028018 0.108336\nv -2.966013 7.821581 -1.136970   \nvn -0.304717 0.841567 0.445996\nv -2.344260 8.122965 0.409043   \nvn 0.121029 0.898197 0.422604\nv -0.951684 5.874251 1.415119   \nvn -0.055091 0.888626 -0.455312\nv -2.834853 7.748319 0.182406   \nvn 0.037292 0.996242 -0.078181\nv -3.242493 7.820096 0.373674   \nvn -0.242950 0.947746 0.206766\nv -0.208532 5.992846 1.252084   \nvn 0.868381 0.472541 0.150399\nv -3.048085 8.431527 -2.129795   \nvn 0.048623 0.739841 0.671022\nv 1.413245 5.806324 2.243906   \nvn -0.213334 0.976523 -0.029844\nv -0.051222 6.064901 0.696093   \nvn -0.819273 -0.563447 -0.106391\nv -4.204306 2.700062 0.713875   \nvn -0.824098 0.261824 -0.502305\nv -4.610997 6.343405 0.344272   \nvn 0.486841 0.856281 0.172535\nv -3.291336 9.305310 -3.340445   \nvn 0.436246 -0.869873 -0.230240\nv -3.272110 7.559239 -2.324016   \nvn -0.504780 0.384982 0.772649\nv -4.238820 6.498344 3.184520   \nvn -0.194356 0.342206 0.919305\nv -3.945317 6.377804 3.386250   \nvn -0.936794 -0.347657 0.039386\nv -4.906378 5.472265 1.315193   \nvn -0.094408 0.991772 -0.086465\nv -3.580131 7.846717 0.709666   \nvn 0.873123 0.466972 -0.139979\nv -1.995504 6.645459 0.688487   \nvn 0.108094 0.927475 0.357918\nv -2.595651 7.860540 0.793351   \nvn 0.021789 -0.998936 -0.040636\nv -0.008849 0.305871 0.184484   \nvn 0.032909 -0.999455 -0.002421\nv -0.029011 0.314116 -0.257312   \nvn 0.779519 0.507028 0.367795\nv -2.522424 7.565392 1.804212   \nvn -0.426877 0.019322 -0.904103\nv -1.022993 8.650826 -0.855609   \nvn 0.010539 0.497590 0.867349\nv -3.831265 6.595426 3.266783   \nvn -0.250188 0.591312 0.766652\nv -4.042525 6.855724 3.060663   \nvn -0.455533 0.745557 0.486450\nv -4.171260 7.404742 2.391387   \nvn 0.957188 0.196411 -0.212637\nv 3.904526 3.767693 0.092179   \nvn -0.238488 0.938575 0.249400\nv 0.268076 6.086802 1.469223   \nvn 0.650919 0.685336 0.326526\nv -3.320456 8.753222 -2.089690   \nvn 0.012639 0.995676 -0.092032\nv 1.203048 6.269250 0.612407   \nvn -0.893970 -0.445532 0.048155\nv -4.406479 2.985974 0.853691   \nvn -0.015255 0.012209 -0.999809\nv -3.226889 6.615215 -0.404243   \nvn -0.333717 -0.348780 0.875777\nv 0.346326 1.602110 3.509858   \nvn -0.253924 0.685982 0.681873\nv -3.955476 7.253323 2.722392   \nvn 0.160115 -0.986822 0.023335\nv -1.232040 0.068935 1.687940   \nvn -0.182894 0.968187 0.170776\nv 0.625436 6.196455 1.333156   \nvn 0.435421 0.502903 0.746657\nv 4.469132 2.165298 1.705250   \nvn -0.101416 0.994050 -0.039735\nv 0.950053 6.262899 0.922441   \nvn -0.296239 0.409324 -0.862958\nv -2.980404 5.254740 -0.663155   \nvn -0.950473 0.297376 0.090386\nv -4.859043 6.287410 1.537081   \nvn -0.401945 0.305147 -0.863322\nv -3.077453 4.641475 -0.892167   \nvn 0.020723 -0.689374 -0.724110\nv -0.440020 8.222503 -0.771454   \nvn -0.615285 0.701961 -0.358713\nv -4.034112 7.639786 0.389935   \nvn 0.172663 0.266563 0.948226\nv -3.696045 6.242042 3.394679   \nvn 0.516215 -0.519666 0.680786\nv -1.221806 7.783617 0.196451   \nvn -0.203946 0.929168 0.308306\nv 0.714610 6.149895 1.656636   \nvn -0.908033 0.158142 -0.387902\nv -4.713539 6.163154 0.495369   \nvn -0.381227 0.670269 -0.636714\nv -1.509869 0.913044 -0.832413   \nvn -0.152388 -0.387296 -0.909274\nv -1.547249 2.066753 -0.852669   \nvn -0.174881 -0.091707 0.980309\nv -3.757734 5.793742 3.455794   \nvn 0.306887 -0.946496 0.099831\nv -0.831911 0.199296 1.718536   \nvn 0.757294 -0.633430 -0.158969\nv -3.062763 7.527180 -1.550559   \nvn -0.048597 0.875655 0.480485\nv 0.938688 6.103354 1.820958   \nvn -0.754606 -0.654735 0.043495\nv -4.037033 2.412311 0.988026   \nvn -0.838341 -0.535044 0.104460\nv -4.130746 2.571806 1.101689   \nvn -0.607519 0.302596 -0.734409\nv -0.693664 9.174283 -0.952323   \nvn -0.399356 0.502963 -0.766514\nv -1.286742 1.079679 -0.751219   \nvn 0.274690 -0.330055 0.903111\nv 1.543185 1.408925 3.483132   \nvn 0.293492 -0.109533 0.949666\nv 1.535973 2.047979 3.655029   \nvn -0.051023 0.779247 0.624636\nv 0.938440 5.841010 2.195219   \nvn -0.000348 0.971499 0.237045\nv -0.684401 5.918492 1.201090   \nvn 0.110880 -0.067775 0.991520\nv 1.288440 2.008676 3.710781   \nvn -0.621811 -0.753172 -0.214667\nv -3.586722 7.435506 -1.454737   \nvn -0.120462 0.473965 0.872265\nv -0.129975 4.384192 2.930593   \nvn -0.524374 -0.243909 0.815807\nv -1.030531 0.281374 3.214273   \nvn 0.799417 -0.539408 -0.264523\nv -3.058751 8.137238 -3.227714   \nvn 0.890847 0.422878 0.166031\nv 3.649524 4.592226 1.340021   \nvn 0.176776 -0.954570 -0.239886\nv -3.354828 7.322425 -1.412086   \nvn -0.081688 0.970094 0.228572\nv 0.936449 6.209237 1.512693   \nvn -0.533691 0.238681 -0.811298\nv -1.001832 3.590411 -1.545892   \nvn -0.506686 -0.304990 0.806381\nv -3.770486 4.593242 2.477056   \nvn 0.184274 -0.981222 -0.056979\nv -0.971925 0.067797 0.921384   \nvn -0.948863 0.243015 0.201501\nv -4.639832 6.865407 2.311791   \nvn 0.153318 -0.948700 -0.276519\nv -0.441014 8.093595 -0.595999   \nvn 0.791984 0.486291 0.369164\nv -2.004852 6.371420 1.635383   \nvn 0.761155 0.190226 -0.620046\nv 4.759591 1.928180 0.328328   \nvn 0.251567 -0.324706 0.911746\nv 3.748064 1.224074 2.140484   \nvn -0.183773 0.693652 0.696472\nv -0.703601 5.285476 2.251988   \nvn -0.166138 0.986094 0.004021\nv 0.595320 6.218930 0.981004   \nvn -0.102716 0.990316 0.093401\nv 0.980799 6.257026 1.242230   \nvn 0.139578 0.965221 -0.221056\nv 1.574697 6.204981 0.381628   \nvn -0.001401 0.926257 0.376889\nv 1.149594 6.173608 1.660763   \nvn 0.205622 0.157684 0.965844\nv -3.501963 5.895989 3.456576   \nvn 0.022126 0.551159 0.834107\nv 1.071122 5.424198 2.588717   \nvn 0.549382 0.356807 0.755558\nv -0.774693 8.473335 -0.276957   \nvn 0.936814 0.309709 -0.162666\nv 3.849959 4.155420 0.396742   \nvn -0.085225 0.541771 -0.836194\nv -0.801715 4.973149 -1.068582   \nvn -0.801360 0.584225 0.128465\nv -2.927676 0.625112 2.326393   \nvn 0.450253 0.336115 0.827224\nv 2.669682 4.045542 2.971184   \nvn -0.920069 0.043225 -0.389365\nv -4.391324 4.740860 0.343463   \nvn 0.120974 0.990585 -0.064078\nv 1.520129 6.270031 0.775471   \nvn 0.205887 0.924944 -0.319514\nv 1.837586 6.084731 0.109188   \nvn 0.006552 0.825863 0.563833\nv 1.271475 5.975024 2.032355   \nvn -0.368259 -0.100415 0.924285\nv -3.487968 4.513249 2.605871   \nvn -0.314880 -0.119473 -0.941582\nv -1.322340 1.517264 -0.691879   \nvn -0.666230 -0.155468 -0.729361\nv -1.080301 1.648226 -0.805526   \nvn -0.109707 -0.483000 -0.868721\nv -3.365703 6.910166 -0.454902   \nvn 0.141204 -0.279669 0.949656\nv 1.360340 0.432238 3.075004   \nvn 0.596929 0.061975 0.799896\nv -3.305013 5.774685 3.391420   \nvn 0.456563 -0.751664 -0.475974\nv 3.884320 0.654141 0.125740   \nvn 0.410202 -0.860597 -0.301840\nv 3.572540 0.377934 0.302501   \nvn 0.599962 -0.645626 -0.472454\nv 4.196136 0.807999 0.212229   \nvn 0.470200 -0.835755 -0.283594\nv 3.932997 0.543123 0.380579   \nvn 0.989862 0.092183 -0.108052\nv 4.023704 3.286125 0.537597   \nvn 0.099786 0.493876 0.863788\nv 1.864455 4.916544 2.691677   \nvn -0.968636 0.248134 0.013159\nv -4.775427 6.499498 1.440153   \nvn -0.428615 0.024504 0.903155\nv -3.464928 3.682340 2.766356   \nvn 0.551842 -0.027476 0.833496\nv 3.648972 1.751262 2.157485   \nvn 0.110008 0.125862 0.985929\nv 1.179111 3.238846 3.774796   \nvn 0.002527 -0.994279 0.106783\nv -0.171164 0.299126 -0.592669   \nvn -0.949240 -0.313249 -0.028607\nv -4.502912 3.316656 0.875188   \nvn -0.502398 0.796197 -0.337146\nv -0.948454 9.214025 -0.679508   \nvn -0.013394 0.999631 0.023652\nv 1.237665 6.288593 1.046000   \nvn 0.145889 0.987938 0.051921\nv 1.523423 6.268963 1.139544   \nvn 0.057447 0.910677 0.409105\nv 1.436519 6.140608 1.739316   \nvn 0.282206 0.049219 0.958091\nv 3.723607 1.504355 2.136762   \nvn 0.280563 0.386919 0.878395\nv 2.009495 4.045514 3.220530   \nvn 0.742667 -0.648505 -0.166995\nv -1.921944 7.249905 0.213973   \nvn 0.129503 -0.392859 0.910434\nv 1.254068 1.205518 3.474709   \nvn -0.168644 0.977619 -0.125783\nv -0.317087 5.996269 0.525872   \nvn -0.213883 0.202509 0.955638\nv -2.996914 3.934607 2.900178   \nvn -0.329136 0.177146 0.927518\nv -3.316873 4.028154 2.785696   \nvn -0.364951 0.224988 0.903433\nv -3.400267 4.280157 2.689268   \nvn -0.076256 0.204812 0.975826\nv -3.134842 4.564875 2.697192   \nvn 0.056618 0.461296 0.885438\nv 1.480563 4.692567 2.834068   \nvn -0.049648 -0.364159 0.930012\nv 0.873682 1.315452 3.541585   \nvn 0.294724 -0.436179 0.850227\nv 1.599355 0.916220 3.246769   \nvn 0.473192 0.432164 0.767674\nv -3.292102 7.125914 2.768515   \nvn 0.903755 0.421661 -0.073689\nv 3.742960 4.511299 0.616539   \nvn 0.807305 -0.207920 -0.552293\nv 4.698935 1.553360 0.269210   \nvn -0.374412 -0.172402 0.911094\nv -3.274387 3.299421 2.823946   \nvn -0.127710 -0.097331 0.987024\nv -2.888090 3.410699 2.955248   \nvn 0.053983 -0.267754 0.961974\nv 1.171407 1.769050 3.688472   \nvn 0.187161 0.519786 0.833543\nv 1.430276 3.924830 3.473666   \nvn 0.904360 0.035539 -0.425287\nv 3.916941 2.553308 0.018941   \nvn -0.107398 -0.195511 0.974803\nv 0.701632 2.442372 3.778639   \nvn 0.210930 -0.067720 0.975153\nv 1.562657 2.302778 3.660957   \nvn 0.718073 -0.453141 -0.528238\nv 4.476622 1.152407 0.182131   \nvn -0.139057 0.892756 0.428544\nv -0.611360 5.761367 1.598838   \nvn -0.305909 0.020401 0.951842\nv -3.102154 3.691687 2.903738   \nvn 0.235766 0.534813 0.811412\nv 1.816012 5.546167 2.380308   \nvn 0.940551 0.339531 0.009059\nv 3.853928 4.250660 0.750017   \nvn 0.150595 0.335031 0.930094\nv 1.234681 3.581665 3.673723   \nvn 0.406176 -0.327698 0.853015\nv 1.862271 1.361863 3.355209   \nvn 0.119917 0.635510 0.762724\nv 1.346844 4.146995 3.327877   \nvn 0.193056 0.526924 0.827696\nv 1.706720 4.080043 3.274307   \nvn -0.082025 -0.143350 0.986267\nv 0.897242 1.908983 3.696900   \nvn 0.580269 0.132926 0.803504\nv -0.587022 9.191132 -0.565301   \nvn -0.308091 0.792435 0.526428\nv -0.217426 5.674606 2.019968   \nvn -0.189157 0.971372 -0.143719\nv 0.278925 6.120777 0.485403   \nvn 0.291523 0.269972 -0.917676\nv 1.463328 3.578742 -2.001464   \nvn -0.182169 0.277268 0.943365\nv -3.072985 4.264581 2.789502   \nvn 0.868025 0.450417 -0.208942\nv 3.623530 4.673843 0.383452   \nvn 0.869573 0.444063 0.215986\nv -3.053491 8.752377 -2.908434   \nvn -0.004794 0.361491 0.932363\nv -2.628687 4.505072 2.755601   \nvn 0.040834 0.393847 0.918269\nv 0.891047 5.113781 2.748272   \nvn -0.215244 -0.282971 0.934664\nv -2.923732 3.065150 2.866368   \nvn 0.035065 0.351289 0.935610\nv 0.848008 4.754252 2.896972   \nvn 0.511754 0.809969 0.286459\nv -3.319184 8.811641 -2.327412   \nvn -0.127700 -0.601293 -0.788758\nv 0.128640 8.814781 -1.334456   \nvn 0.137903 0.357358 -0.923731\nv 1.549501 4.549331 -1.282430   \nvn 0.256452 0.420816 0.870141\nv 1.647161 3.738973 3.507719   \nvn 0.073209 -0.525872 0.847407\nv 1.250888 0.945599 3.348739   \nvn 0.885603 0.345423 -0.310468\nv 3.809662 4.038822 0.053142   \nvn 0.162441 -0.400297 0.901873\nv 1.483166 0.673327 3.091560   \nvn 0.100365 0.314352 0.943986\nv 0.829726 3.635921 3.713103   \nvn 0.134307 0.396843 0.908007\nv 1.352914 5.226651 2.668113   \nvn 0.295370 0.491196 0.819440\nv 2.237352 4.374140 3.016386   \nvn 0.726639 -0.683855 -0.065868\nv 4.507929 0.889447 0.744249   \nvn 0.755902 -0.575841 -0.311480\nv 4.573040 1.010981 0.496588   \nvn 0.207977 0.172997 0.962714\nv 3.931422 1.720989 2.088175   \nvn -0.116905 0.992583 0.033361\nv -0.463177 5.989835 0.834346   \nvn -0.055035 0.098040 0.993659\nv -2.811236 3.745023 2.969587   \nvn -0.080402 0.293329 0.952625\nv -2.805135 4.219721 2.841108   \nvn 0.034854 0.345195 0.937884\nv -2.836842 4.802543 2.608260   \nvn 0.404927 -0.167263 0.898920\nv 1.776716 2.084611 3.568638   \nvn 0.315003 -0.113203 0.942315\nv 4.046881 1.463478 2.106273   \nvn -0.229706 0.878571 0.418746\nv 0.316265 5.944313 1.892785   \nvn -0.227707 -0.449612 0.863712\nv -2.863470 2.776049 2.772420   \nvn -0.071998 -0.229665 0.970603\nv -2.673644 3.116508 2.907104   \nvn 0.003420 0.238213 0.971207\nv -2.621149 4.018502 2.903409   \nvn 0.233960 0.087421 0.968308\nv -2.573447 5.198013 2.477481   \nvn 0.069508 -0.073917 0.994839\nv 1.104039 2.278985 3.722469   \nvn -0.987087 0.133000 -0.089275\nv -4.602743 4.306413 0.902296   \nvn -0.845269 -0.534341 -0.000072\nv -2.684878 1.510731 0.535039   \nvn 0.575914 -0.735476 -0.356928\nv 0.092036 8.473269 -0.994130   \nvn 0.101013 0.727717 0.678398\nv -1.280472 5.602393 1.928105   \nvn -0.215229 0.269785 -0.938559\nv -1.027900 4.121582 -1.403103   \nvn -0.017099 -0.100371 0.994803\nv -2.461081 3.304477 2.957317   \nvn 0.029922 0.076181 0.996645\nv -2.375929 3.659383 2.953233   \nvn 0.197174 -0.028898 0.979943\nv 1.417579 2.715389 3.718767   \nvn -0.001778 0.025692 0.999668\nv 0.819727 2.948823 3.810639   \nvn 0.135574 -0.494675 0.858438\nv 1.329962 0.761779 3.203724   \nvn 0.203372 0.460638 0.863975\nv 1.739520 5.295229 2.537725   \nvn 0.087881 0.579803 0.810003\nv 0.952523 3.945016 3.548229   \nvn -0.231964 0.621439 0.748336\nv -2.569498 0.633669 2.848180   \nvn -0.081419 0.695664 0.713738\nv -2.276676 0.757013 2.780717   \nvn 0.173077 -0.602340 -0.779250\nv -2.013147 7.354429 -0.003202   \nvn -0.056616 -0.296642 0.953309\nv 0.931430 1.565913 3.600325   \nvn 0.117141 -0.320512 0.939973\nv 1.249014 1.550556 3.585842   \nvn 0.328641 0.316351 0.889897\nv 2.287252 4.072353 3.124544   \nvn -0.989818 0.033483 0.138348\nv -4.734900 7.006244 1.690653   \nvn 0.072978 0.972051 0.223140\nv -3.500602 8.803860 -2.009196   \nvn -0.280730 0.777410 0.562872\nv -0.582629 5.549138 2.000923   \nvn 0.700733 0.641176 0.312837\nv -1.865297 6.356066 1.313593   \nvn -0.393459 -0.683191 -0.615175\nv -3.212154 2.376143 -0.565593   \nvn 0.485862 0.310940 -0.816857\nv 2.092889 3.493536 -1.727931   \nvn -0.120047 -0.400953 0.908199\nv -2.528501 2.784531 2.833758   \nvn 0.054521 0.370727 0.927140\nv -2.565697 4.893154 2.559605   \nvn 0.144889 0.417140 0.897219\nv -2.153366 5.045840 2.465215   \nvn 0.284593 -0.036731 0.957944\nv 1.631311 2.568241 3.681445   \nvn 0.221407 0.552244 0.803744\nv 2.150193 4.699227 2.807505   \nvn -0.098167 0.436535 0.894316\nv 0.507599 5.018130 2.775892   \nvn 0.290299 0.352687 0.889572\nv 4.129862 1.863698 2.015101   \nvn 0.856570 0.422877 -0.295742\nv 3.578279 4.507660 -0.009598   \nvn 0.835999 0.480768 0.264516\nv 3.491023 4.806749 1.549265   \nvn -0.148329 -0.288295 0.945983\nv 0.619485 1.625336 3.605125   \nvn 0.167497 -0.018017 0.985708\nv 1.107499 2.932557 3.790061   \nvn 0.991929 0.044262 0.118821\nv -2.082292 6.993210 0.742601   \nvn 0.938017 -0.344341 0.039399\nv 4.839909 1.379279 0.945274   \nvn 0.848834 0.372249 -0.375383\nv 3.591328 4.322645 -0.259497   \nvn 0.095968 -0.371277 0.923550\nv 1.055245 0.710686 3.165530   \nvn 0.158467 0.974675 0.157791\nv -3.026494 7.842227 1.624553   \nvn -0.249769 0.968114 0.019250\nv 0.146569 6.119214 0.981673   \nvn -0.066186 -0.368079 0.927436\nv -2.043687 2.614509 2.785526   \nvn -0.057786 -0.204122 0.977238\nv -2.302242 3.047775 2.936355   \nvn 0.032062 0.250042 0.967704\nv -2.245686 4.100424 2.877940   \nvn 0.213267 0.501186 0.838647\nv 2.116148 5.063507 2.572204   \nvn 0.588746 -0.671677 0.449697\nv -1.448406 7.645590 0.251692   \nvn 0.348636 0.517902 0.781172\nv 2.550717 4.926800 2.517526   \nvn 0.962863 -0.253623 -0.092578\nv -2.955456 7.802930 -1.782407   \nvn 0.070556 0.603365 0.794338\nv 1.882995 4.637167 2.895436   \nvn 0.100134 -0.027110 0.994605\nv -2.014924 3.398262 2.954896   \nvn 0.019170 0.432427 0.901465\nv -2.273654 4.771227 2.611418   \nvn 0.254294 0.632614 0.731528\nv -2.162723 7.876761 0.702473   \nvn -0.305140 0.873937 0.378316\nv -0.198659 5.823062 1.739272   \nvn -0.400656 -0.398443 -0.825057\nv -1.280908 2.133189 -0.921241   \nvn 0.217953 0.401476 0.889558\nv 2.039932 4.251568 3.136579   \nvn 0.002915 0.654910 0.755701\nv 1.477815 4.354333 3.108325   \nvn -0.030866 0.422173 0.905990\nv 0.560504 3.744128 3.691300   \nvn -0.556126 0.670561 0.490990\nv -2.234018 1.054373 2.352782   \nvn 0.582023 -0.731267 -0.355665\nv -3.189156 7.686661 -2.514955   \nvn -0.175350 0.928865 0.326284\nv -3.744736 7.699630 2.116973   \nvn -0.006910 -0.332438 0.943100\nv -2.283366 2.878365 2.878820   \nvn 0.019764 0.363949 0.931209\nv -2.153786 4.457481 2.743529   \nvn 0.979491 -0.183508 -0.083203\nv 4.933978 1.677287 0.713773   \nvn 0.331185 -0.721940 0.607551\nv 3.502146 0.535336 1.752511   \nvn 0.064106 0.554633 0.829622\nv 1.825169 4.419253 3.081198   \nvn 0.253732 -0.835435 -0.487513\nv 3.072331 0.280979 0.106534   \nvn -0.547475 0.468930 0.693092\nv -0.508381 1.220392 2.878049   \nvn 0.701635 0.688139 0.184860\nv -3.138824 8.445394 -1.659711   \nvn 0.097776 -0.182199 0.978388\nv -2.056425 2.954815 2.897241   \nvn 0.369059 0.469812 0.801918\nv -2.035343 5.398477 2.215842   \nvn 0.181149 -0.832905 -0.522929\nv -3.239915 7.126798 -0.712547   \nvn 0.254840 0.453040 0.854290\nv -1.867923 7.989805 0.526518   \nvn 0.004379 0.981319 0.192339\nv 1.234050 6.248973 1.387189   \nvn 0.003261 -0.702481 -0.711695\nv -0.216492 8.320933 -0.862495   \nvn 0.084559 0.116019 0.989641\nv -2.079659 3.755709 2.928563   \nvn 0.027511 0.286379 0.957721\nv -1.785950 4.300374 2.805295   \nvn 0.093100 0.579372 0.809728\nv -1.856589 5.106780 2.386572   \nvn 0.158818 0.652345 0.741096\nv -1.714362 5.544778 2.004623   \nvn 0.190864 0.545596 -0.816024\nv 1.722403 4.200291 -1.408161   \nvn 0.121578 -0.991673 -0.042464\nv 0.195386 0.086928 -1.318006   \nvn 0.250979 -0.007087 0.967967\nv 1.393693 3.013404 3.710686   \nvn -0.167250 -0.516052 -0.840070\nv -0.415307 8.508471 -0.996883   \nvn -0.069150 0.524236 0.848761\nv -1.853777 0.755635 2.757275   \nvn 0.028942 0.053127 0.998168\nv -1.724057 3.645330 2.884251   \nvn 0.062580 0.538465 0.840321\nv -1.884511 4.927802 2.530885   \nvn 0.404661 -0.910208 -0.088152\nv -1.017174 7.783908 -0.227078   \nvn -0.149345 -0.239416 0.959362\nv -1.779800 2.342513 2.741749   \nvn 0.079409 0.143654 0.986437\nv -1.841329 3.943996 2.884360   \nvn 0.135753 0.547876 0.825471\nv 1.430388 5.468067 2.503467   \nvn -0.205941 0.552443 0.807710\nv -2.030296 0.940028 2.611088   \nvn -0.270041 0.146017 0.951713\nv -1.677028 1.215666 2.607771   \nvn 0.028616 -0.160097 0.986686\nv -1.740920 2.832564 2.827295   \nvn 0.561919 -0.790435 -0.243844\nv 4.144673 0.631374 0.503358   \nvn 0.596182 -0.801042 -0.053841\nv 4.238811 0.653992 0.762436   \nvn -0.351718 -0.283884 0.892023\nv -1.847016 2.082815 2.642674   \nvn 0.988520 0.150799 0.009397\nv 4.045764 3.194073 0.852117   \nvn 0.374995 0.315189 0.871799\nv -1.563989 8.112739 0.303102   \nvn -0.358788 -0.158088 0.919935\nv -1.781627 1.794836 2.602338   \nvn 0.005035 -0.125272 0.992110\nv -1.493749 2.533799 2.797251   \nvn 0.027013 0.422865 0.905790\nv -1.934496 4.690689 2.658999   \nvn 0.226493 0.756393 0.613654\nv -1.499174 5.777946 1.747498   \nvn -0.842657 0.530880 -0.089979\nv -2.387409 0.851291 1.500524   \nvn 0.004936 0.584325 0.811505\nv -1.872211 8.269987 0.392533   \nvn -0.926010 0.192890 -0.324498\nv -4.647726 6.765771 0.833653   \nvn -0.599514 0.277405 -0.750753\nv -3.157482 0.341958 -0.206710   \nvn 0.081528 -0.089157 0.992675\nv -1.725766 3.247030 2.883579   \nvn -0.057772 0.206074 0.976829\nv -1.458199 4.079031 2.836325   \nvn 0.049939 0.417085 0.907494\nv -1.621548 4.515869 2.719266   \nvn 0.077207 0.538240 0.839248\nv -1.607292 4.918914 2.505881   \nvn 0.033186 0.698911 0.714438\nv -1.494661 5.556239 1.991599   \nvn 0.349061 -0.776157 -0.525107\nv -1.727269 7.423769 0.012337   \nvn -0.090568 0.247592 0.964622\nv -1.382497 1.161322 2.640222   \nvn 0.065003 0.461859 0.884568\nv -1.521290 4.681714 2.615467   \nvn -0.853035 -0.500458 0.147897\nv -4.247127 2.792812 1.250843   \nvn -0.149646 0.341952 0.927726\nv -1.576338 0.742947 2.769799   \nvn -0.114010 -0.180424 0.976959\nv -1.499257 2.172763 2.743142   \nvn -0.011479 -0.149085 0.988758\nv -1.480392 3.103261 2.862262   \nvn 0.083687 -0.117104 0.989587\nv 1.049137 2.625836 3.775384   \nvn -0.005981 -0.157309 0.987531\nv -1.368063 1.791587 2.695516   \nvn 0.059349 -0.118875 0.991134\nv -1.307839 2.344534 2.767575   \nvn 0.023543 0.564658 0.824989\nv -1.336758 5.092221 2.355225   \nvn 0.067650 0.633767 0.770560\nv -1.561700 5.301749 2.216250   \nvn 0.150997 0.450018 0.880161\nv -1.483362 8.537704 0.196752   \nvn -0.430852 0.678888 0.594540\nv -1.517348 8.773614 0.074053   \nvn -0.101113 -0.063499 0.992846\nv -1.474302 1.492731 2.641433   \nvn 0.691629 -0.562889 -0.452554\nv 2.487180 0.644247 -0.920226   \nvn 0.195219 -0.199501 0.960255\nv 0.818091 0.422682 3.171218   \nvn 0.151216 0.545742 0.824196\nv -3.623398 6.930094 3.033045   \nvn 0.319422 0.250104 0.914012\nv 1.676333 3.531039 3.591591   \nvn 0.019528 0.680704 0.732298\nv 1.199939 5.683873 2.365623   \nvn 0.353593 0.323489 0.877683\nv -1.223851 8.841201 0.025414   \nvn -0.124149 0.098510 0.987362\nv -1.286307 3.847643 2.918044   \nvn -0.038410 0.511787 0.858253\nv -1.258570 4.810831 2.543605   \nvn 0.496272 0.684007 0.534647\nv 2.603662 5.572146 1.991854   \nvn -0.274038 0.798579 0.535886\nv 0.138984 5.779724 2.077834   \nvn 0.031052 -0.151310 0.987998\nv -1.267039 3.175169 2.890889   \nvn -0.111339 -0.058399 0.992065\nv -1.293616 3.454612 2.911774   \nvn -0.945508 -0.006835 -0.325526\nv -2.601120 1.277184 0.077240   \nvn 0.440218 0.222900 0.869784\nv 2.552779 3.649877 3.163643   \nvn -0.069757 0.239867 0.968296\nv -1.038983 1.248011 2.605933   \nvn -0.065274 0.389567 0.918682\nv -1.288709 4.390967 2.761214   \nvn 0.031828 0.717089 0.696254\nv -1.034218 5.485963 2.011467   \nvn 0.055804 -0.038016 0.997718\nv -1.185576 1.464842 2.624335   \nvn -0.001072 -0.153622 0.988129\nv -1.045682 2.548960 2.761102   \nvn 0.397849 0.066124 0.915065\nv 4.259176 1.660627 2.018096   \nvn 0.052787 -0.113585 0.992125\nv -0.961707 1.717183 2.598342   \nvn -0.161129 -0.231244 0.959460\nv -1.044603 3.147464 2.855335   \nvn -0.148178 0.503565 0.851155\nv -0.891998 4.685429 2.669696   \nvn -0.065723 0.616264 0.784793\nv -1.027561 5.081672 2.377939   \nvn 0.651270 -0.694777 -0.305174\nv 4.386506 0.832434 0.510074   \nvn 0.307441 0.578835 0.755268\nv -1.014225 9.064991 -0.175352   \nvn 0.011857 -0.147540 0.988985\nv -1.218752 2.895443 2.823785   \nvn -0.149343 0.417906 0.896131\nv -0.972075 4.432669 2.788005   \nvn -0.782675 0.598183 -0.172036\nv -2.714986 0.524250 1.509798   \nvn -0.458302 0.023971 0.888473\nv -0.699248 1.517219 2.645738   \nvn 0.102574 -0.167529 0.980517\nv -1.161581 2.078852 2.722795   \nvn -0.518974 -0.099271 0.849006\nv -0.845249 3.286247 2.996471   \nvn 0.002368 0.573104 0.819479\nv 1.068329 4.443444 2.993863   \nvn 0.983803 0.166101 0.067399\nv 3.981320 3.715557 1.027775   \nvn 0.283882 0.656939 -0.698457\nv 1.658097 3.982428 -1.651688   \nvn -0.727447 -0.667596 -0.158544\nv -4.053701 2.449888 0.734746   \nvn -0.087803 -0.199561 0.975944\nv -0.910935 2.214149 2.702393   \nvn -0.288448 0.608289 0.739447\nv 0.087824 3.961650 3.439344   \nvn -0.338024 0.139953 0.930673\nv -0.779714 3.724134 2.993429   \nvn -0.133489 0.056390 0.989445\nv -1.051093 3.810797 2.941957   \nvn -0.165464 0.413860 0.895177\nv -0.644941 4.385900 2.870863   \nvn 0.201532 -0.349027 -0.915186\nv -2.984030 8.666895 -3.691888   \nvn -0.581899 -0.302324 0.754979\nv -0.754304 2.508325 2.812999   \nvn -0.969411 -0.213320 -0.121399\nv -4.635524 3.662891 0.913005   \nvn -0.144639 0.250083 0.957360\nv -0.983299 4.125978 2.915378   \nvn 0.941053 0.195915 -0.275748\nv 4.916497 1.905209 0.621315   \nvn 0.886786 -0.127944 -0.444117\nv 4.874983 1.728429 0.468521   \nvn 0.316635 0.522618 0.791589\nv 2.331270 5.181957 2.441697   \nvn -0.625008 -0.275585 0.730355\nv -0.653711 2.253387 2.794900   \nvn 0.008624 0.894860 0.446263\nv -3.623744 8.978795 -2.461920   \nvn -0.808542 0.145123 -0.570263\nv -4.555927 6.160279 0.215755   \nvn -0.990079 0.013009 -0.139907\nv -4.940628 5.806712 1.183830   \nvn 0.741616 -0.051451 -0.668848\nv 3.308506 2.403260 -0.910776   \nvn -0.074566 0.619625 -0.781348\nv 0.588350 5.251928 -0.992886   \nvn 0.304820 0.584258 0.752149\nv 2.152215 5.449733 2.331679   \nvn -0.355548 0.593749 0.721836\nv -0.712755 0.766765 3.280375   \nvn -0.346133 -0.172475 0.922195\nv -0.741771 1.971600 2.657235   \nvn -0.964711 -0.182398 0.189902\nv -4.828957 5.566946 2.635623   \nvn 0.234955 0.893683 0.382265\nv -3.474788 8.696771 -1.776121   \nvn 0.244667 0.960795 0.130424\nv 1.770417 6.205561 1.331627   \nvn -0.294609 0.287313 0.911404\nv -0.620626 4.064721 2.968972   \nvn -0.112811 -0.428409 -0.896515\nv -1.499187 2.307735 -0.978901   \nvn 0.513731 0.572616 0.638898\nv 4.098793 2.330245 1.667951   \nvn 0.271663 0.961526 -0.040830\nv 1.940444 6.167057 0.935904   \nvn -0.974024 0.226444 0.000067\nv -2.314436 1.104995 1.681277   \nvn 0.414977 0.879419 0.233275\nv -2.733629 7.742793 1.770500   \nvn -0.163195 0.452092 0.876915\nv -0.452248 4.719868 2.740834   \nvn -0.202565 0.566302 0.798918\nv -0.649143 4.951713 2.541296   \nvn 0.468493 0.505495 0.724561\nv -0.479417 9.439590 -0.676324   \nvn 0.668862 0.305834 -0.677561\nv -2.251853 6.559275 0.046819   \nvn 0.773339 -0.627936 0.087421\nv 0.033531 8.316907 -0.789939   \nvn -0.302814 0.689229 0.658230\nv -0.513125 0.995673 3.125462   \nvn -0.867709 0.381975 0.318083\nv -2.637602 1.039747 0.602434   \nvn 0.096153 0.970492 0.221135\nv 1.527513 6.230089 1.430903   \nvn 0.865867 0.279169 0.415137\nv 4.036124 2.609846 1.506498   \nvn -0.072393 0.997276 -0.014137\nv -3.559828 7.877892 1.228076   \nvn -0.915767 -0.362808 -0.172456\nv -4.570736 4.960193 0.838201   \nvn -0.267375 0.596013 0.757152\nv -0.432121 5.157731 2.467518   \nvn -0.089089 0.355103 -0.930572\nv -1.206735 4.562511 -1.237054   \nvn -0.452288 0.438169 -0.776816\nv -0.823768 3.788746 -1.567481   \nvn 0.737666 -0.644126 -0.202362\nv -3.095544 7.353613 -1.024577   \nvn -0.364247 0.862097 0.352297\nv -4.056088 7.631119 2.062001   \nvn -0.280071 0.663388 0.693885\nv -0.289385 5.382261 2.329421   \nvn 0.182691 0.910954 0.369847\nv 1.697520 6.136483 1.667037   \nvn -0.215772 0.509780 0.832807\nv -0.168758 5.061138 2.617453   \nvn 0.705667 -0.214750 -0.675216\nv 2.853576 1.605528 -1.229958   \nvn -0.804980 0.310227 -0.505734\nv -4.514319 6.586675 0.352756   \nvn 0.558950 0.805358 0.197417\nv -2.558081 7.741151 1.292950   \nvn 0.131650 0.805562 0.577702\nv 1.611160 5.923580 2.071534   \nvn 0.971908 0.038533 -0.232183\nv 3.936921 3.354857 0.091755   \nvn -0.358130 0.228313 0.905326\nv -0.163300 1.119272 3.147975   \nvn -0.518333 -0.189136 0.834001\nv 0.067551 1.593475 3.382120   \nvn -0.480467 -0.514193 -0.710462\nv -1.303239 2.328184 -1.011672   \nvn -0.078544 0.474100 0.876961\nv -0.438093 0.734230 3.398384   \nvn -0.993638 0.025346 -0.109734\nv -4.627670 3.898187 0.849573   \nvn -0.227238 0.747623 0.624037\nv 0.286853 4.165281 3.284834   \nvn 0.918159 -0.304917 -0.253003\nv -2.968052 8.492812 -3.493693   \nvn -0.405899 0.445398 0.798039\nv -0.111896 3.696111 3.537910   \nvn -0.661829 0.646655 0.379235\nv -3.808245 8.451731 -1.574742   \nvn -0.280980 0.682928 0.674285\nv 0.053416 5.558764 2.311070   \nvn 0.953710 0.024567 -0.299722\nv 3.956269 3.012071 0.111210   \nvn 0.117772 -0.742671 -0.659219\nv -0.710956 8.106561 -0.665154   \nvn -0.206946 -0.154681 0.966047\nv 0.234725 2.717326 3.722379   \nvn -0.337920 -0.185100 0.922793\nv -0.031594 2.764110 3.657347   \nvn -0.156429 0.387439 0.908527\nv -0.017371 4.700633 2.819110   \nvn -0.171570 0.438615 0.882146\nv 0.215064 5.034859 2.721426   \nvn 0.630906 0.202770 0.748894\nv -0.111151 8.480333 -0.649399   \nvn 0.979588 0.151037 -0.132650\nv 3.979420 3.575478 0.362219   \nvn -0.105146 0.346415 0.932170\nv 0.392962 4.735392 2.874321   \nvn 0.286418 0.552063 0.783065\nv 4.170150 2.085087 1.865999   \nvn -0.320497 -0.275116 0.906417\nv 0.169054 1.244786 3.337709   \nvn -0.243720 0.047373 0.968688\nv 0.020049 3.165818 3.721736   \nvn -0.225859 0.340031 0.912889\nv 0.248212 3.595518 3.698376   \nvn -0.210708 0.550096 0.808082\nv 0.130706 5.295541 2.540034   \nvn -0.984578 -0.174945 0.000083\nv -4.541357 4.798332 1.026866   \nvn -0.453255 0.083474 -0.887464\nv -1.277485 1.289518 -0.667272   \nvn 0.932318 0.078658 -0.352981\nv 3.892133 3.542630 -0.078056   \nvn 0.988580 0.131547 0.073520\nv 4.057379 3.036690 0.997913   \nvn -0.046510 -0.098298 0.994070\nv 0.287719 0.884758 3.251787   \nvn -0.173349 -0.384786 0.906581\nv 0.535771 1.144701 3.400096   \nvn -0.243054 -0.306093 0.920452\nv 0.585303 1.399362 3.505353   \nvn -0.378625 -0.182322 0.907415\nv 0.191551 2.076246 3.549355   \nvn -0.255154 -0.232431 0.938548\nv 0.328656 2.394576 3.649623   \nvn -0.113876 0.034725 0.992888\nv 0.413124 3.240728 3.771515   \nvn -0.029653 0.507712 0.861017\nv 0.630361 4.501549 2.963623   \nvn -0.151195 0.780337 0.606807\nv 0.529441 5.854392 2.120225   \nvn 0.898441 0.209066 -0.386130\nv 3.805796 3.769958 -0.162079   \nvn 0.772977 0.349589 -0.529428\nv 3.447279 4.344846 -0.467276   \nvn -0.185642 0.671466 0.717406\nv 0.377618 5.551116 2.426017   \nvn -0.283213 -0.153572 0.946681\nv 0.409355 1.821269 3.606333   \nvn -0.138717 -0.148371 0.979155\nv 0.719959 2.194726 3.703851   \nvn -0.050442 0.171547 0.983884\nv 0.495922 3.501519 3.755661   \nvn -0.105925 0.519070 0.848143\nv 0.603408 5.354097 2.603088   \nvn -0.636061 0.756845 -0.150370\nv -4.605056 7.531978 1.195790   \nvn -0.031870 -0.459562 0.887574\nv 0.907972 0.973128 3.356513   \nvn 0.033289 0.161867 0.986251\nv 0.750134 3.356137 3.765847   \nvn -0.116518 0.620364 0.775611\nv 0.449600 3.993244 3.504544   \nvn 0.961425 -0.273394 -0.030298\nv -3.030738 7.489470 -1.259169   \nvn -0.067893 0.680301 0.729782\nv 0.707505 5.602005 2.434760   \nvn 0.130476 -0.175453 0.975803\nv 0.668944 0.654891 3.213797   \nvn -0.124907 -0.087589 0.988295\nv 0.593244 2.700978 3.791427   \nvn 0.254541 0.132041 0.958005\nv 1.467759 3.303270 3.710350   \nvn 0.672023 -0.063709 0.737784\nv 3.316249 2.436388 2.581175   \nvn 0.614206 -0.219620 0.757970\nv 3.261380 1.724425 2.539028   \nvn 0.443889 0.128018 0.886890\nv -1.231292 7.968263 0.281414   \nvn 0.529099 0.406367 0.744930\nv -0.108773 8.712307 -0.790607   \nvn 0.549559 0.224276 0.804789\nv 4.445684 1.819442 1.896988   \nvn 0.447329 -0.151842 0.881386\nv 1.998959 2.281499 3.494470   \nvn 0.497795 -0.195199 0.845043\nv 2.162269 2.113817 3.365449   \nvn 0.584728 -0.261324 0.767987\nv 4.363397 1.406731 1.922714   \nvn 0.825844 0.457018 -0.330326\nv 4.808000 2.225842 0.611127   \nvn 0.646764 -0.643234 -0.409813\nv 2.735919 0.771812 -0.701142   \nvn 0.327861 0.042953 0.943749\nv 1.897735 2.878428 3.583482   \nvn 0.452592 -0.542374 0.707808\nv -3.316160 5.331985 3.212394   \nvn 0.585685 0.323442 0.743208\nv -3.331400 6.018137 3.313018   \nvn 0.473438 0.372562 0.798157\nv -3.503183 6.480103 3.222216   \nvn 0.570443 0.453188 0.684993\nv -1.904453 5.750392 1.913324   \nvn -0.368966 -0.056489 -0.927725\nv -1.339735 3.559592 -1.421817   \nvn 0.430377 0.353867 0.830394\nv -1.044242 8.225390 0.037414   \nvn 0.325261 0.061141 0.943646\nv 1.643492 3.110676 3.647424   \nvn 0.987200 0.154411 -0.039922\nv 3.992832 3.686244 0.710946   \nvn 0.427639 -0.215873 0.877795\nv 1.774207 1.718420 3.475768   \nvn 0.287684 -0.304980 0.907868\nv -3.438842 5.571300 3.427818   \nvn 0.727634 -0.398737 0.558173\nv 4.602447 1.258300 1.619528   \nvn 0.576064 -0.461132 0.674913\nv -0.925516 7.930042 0.072336   \nvn -0.226129 0.173297 -0.958558\nv -1.252093 3.846565 -1.420761   \nvn 0.355807 -0.766815 0.534225\nv -3.426857 5.072419 2.978060   \nvn 0.709847 0.295754 0.639255\nv -3.160408 6.152629 3.061869   \nvn 0.878527 0.076244 0.471569\nv 3.739931 3.367082 2.041273   \nvn 0.032670 0.730382 0.682257\nv 1.027419 4.235891 3.251253   \nvn 0.788731 0.147121 0.596875\nv 4.777703 1.887452 1.560409   \nvn 0.599429 0.340191 0.724537\nv -3.318528 6.733796 2.982968   \nvn 0.526174 0.534775 0.661178\nv 2.929265 4.962579 2.271079   \nvn 0.758468 -0.050134 0.649779\nv 3.449761 2.838629 2.474576   \nvn 0.420185 -0.735038 0.532130\nv -3.280159 5.029875 2.787514   \nvn 0.992155 0.114181 -0.050899\nv 4.068939 2.993629 0.741567   \nvn 0.922673 -0.368977 0.111939\nv 0.303312 8.709270 -1.121972   \nvn 0.685367 0.349344 0.638930\nv 0.229852 8.981322 -1.186075   \nvn 0.625162 0.284779 0.726686\nv -0.011045 9.148156 -1.047057   \nvn 0.727250 -0.177099 0.663132\nv -2.942683 5.579613 2.929297   \nvn 0.754649 -0.058036 0.653557\nv -3.145409 5.698727 3.205778   \nvn 0.702637 0.302731 0.643937\nv -3.019089 6.308870 2.794323   \nvn 0.708997 0.277272 0.648416\nv -3.217135 6.468191 2.970032   \nvn 0.681300 0.121553 0.721842\nv -3.048298 6.993641 2.623378   \nvn 0.712876 0.249618 0.655362\nv -3.074290 6.660982 2.702434   \nvn 0.806909 0.001791 0.590674\nv 3.612011 2.557400 2.253490   \nvn 0.382265 0.503227 0.775007\nv 2.545160 4.553967 2.758840   \nvn 0.631927 -0.766921 0.111805\nv -1.683759 7.400787 0.250868   \nvn 0.654467 -0.455360 0.603590\nv -1.756066 7.463557 0.448031   \nvn 0.530136 -0.565361 0.631920\nv -3.023761 5.149697 2.673539   \nvn 0.647738 -0.122009 0.752030\nv 3.112376 2.677218 2.782378   \nvn 0.499459 0.431116 0.751452\nv 2.835327 4.581196 2.567146   \nvn 0.609801 0.316929 0.726429\nv -2.973799 7.225458 2.506988   \nvn 0.569263 0.247590 0.783989\nv -0.591645 8.740662 -0.505845   \nvn 0.619308 0.170501 0.766412\nv 3.782861 2.043370 2.030660   \nvn 0.725552 0.090909 0.682136\nv 3.331604 3.363430 2.605047   \nvn 0.551646 -0.398549 0.732697\nv 2.966866 1.205497 2.537432   \nvn -0.162467 0.910550 -0.380135\nv 0.002669 9.654748 -1.355559   \nvn 0.697930 -0.362953 0.617381\nv 2.632801 0.584970 2.540311   \nvn 0.245009 -0.050986 0.968179\nv -2.819398 5.087372 2.521098   \nvn 0.456744 0.571353 0.681866\nv 2.616193 5.332961 2.194288   \nvn 0.233682 -0.073744 0.969513\nv -3.193973 4.925634 2.607924   \nvn 0.635335 -0.509121 0.580642\nv -3.126180 5.275240 2.944544   \nvn 0.454863 0.332547 0.826143\nv -0.426003 8.516354 -0.501528   \nvn 0.560419 -0.321748 0.763157\nv 2.802717 1.387643 2.751649   \nvn 0.713101 -0.635000 -0.297089\nv -3.120597 7.889111 -2.754310   \nvn 0.540842 -0.193417 0.818584\nv 2.636648 1.717020 2.991302   \nvn 0.694495 0.216550 0.686136\nv -2.853151 6.711792 2.430276   \nvn 0.721672 0.080353 0.687555\nv -2.843836 6.962865 2.400842   \nvn 0.378903 0.151209 0.913000\nv 1.969600 3.199023 3.504514   \nvn 0.082655 0.054731 0.995074\nv -2.461751 0.386352 3.008994   \nvn 0.242502 -0.330193 0.912231\nv 1.641270 0.495758 3.029580   \nvn -0.648882 -0.275595 -0.709225\nv -4.330472 5.409831 0.025287   \nvn 0.686116 0.221644 0.692907\nv -2.912387 5.980416 2.844261   \nvn -0.067781 -0.568408 0.819950\nv -2.490069 0.211078 2.985391   \nvn 0.841287 0.540126 -0.022380\nv 3.581816 4.809118 0.733728   \nvn 0.611588 -0.154477 0.775949\nv 2.693199 2.647213 3.126709   \nvn 0.584712 -0.810557 0.033305\nv -0.182964 8.184108 -0.638459   \nvn 0.289829 0.008499 0.957041\nv -2.226855 0.444711 2.946552   \nvn 0.458183 0.220566 0.861057\nv -0.720175 8.115055 0.017689   \nvn 0.425587 0.435522 0.793219\nv 2.645302 4.316212 2.850139   \nvn 0.663917 0.202915 0.719750\nv -0.232764 9.329503 -0.918639   \nvn 0.885699 -0.370053 -0.280354\nv 4.852365 1.471901 0.652750   \nvn 0.566379 -0.089993 0.819217\nv 2.762290 2.014994 2.957755   \nvn 0.586307 -0.344438 0.733216\nv -2.808374 5.354301 2.644695   \nvn 0.635435 0.342168 0.692202\nv -2.790967 6.406963 2.547985   \nvn -0.569922 0.278872 -0.772929\nv -1.342684 0.418488 -1.669183   \nvn 0.566111 0.736999 -0.369257\nv 2.690675 5.593587 -0.041236   \nvn 0.711432 -0.120581 0.692333\nv 4.660146 1.631800 1.713314   \nvn 0.615969 -0.033825 0.787044\nv 2.775667 3.007229 3.111332   \nvn 0.587957 0.225254 0.776896\nv -0.396696 8.963432 -0.706202   \nvn 0.529707 -0.091325 0.843250\nv 2.446707 2.740617 3.321433   \nvn -0.963109 0.132345 0.234318\nv -4.803209 5.884634 2.603672   \nvn -0.466234 -0.830433 0.304970\nv -2.652003 1.654100 1.507800   \nvn 0.966093 0.256323 0.031040\nv 3.932327 3.972874 0.831924   \nvn 0.454294 -0.318014 0.832156\nv 2.135906 0.955587 2.986608   \nvn 0.543755 -0.162648 0.823332\nv 2.486131 2.053802 3.124115   \nvn 0.770058 -0.274327 0.575982\nv -0.386706 8.115753 -0.375650   \nvn 0.713508 0.265387 0.648441\nv -2.720727 7.325044 2.224878   \nvn 0.115168 -0.851509 -0.511536\nv -1.396946 7.638016 -0.164860   \nvn 0.597565 -0.708401 0.375611\nv -0.620830 7.989771 -0.144413   \nvn 0.650107 -0.045322 0.758490\nv -2.653272 5.729684 2.667679   \nvn 0.658799 0.423297 0.621936\nv 3.038188 4.658350 2.364142   \nvn 0.567125 -0.237299 0.788707\nv 2.381721 0.739472 2.788992   \nvn 0.514297 0.050403 0.856130\nv -2.345829 5.474929 2.380633   \nvn 0.635995 0.299989 0.710997\nv -2.518983 6.080562 2.479383   \nvn 0.742966 0.208721 0.635953\nv -2.615793 6.839622 2.186116   \nvn 0.172040 -0.822147 0.542657\nv -2.286566 0.143752 2.766848   \nvn -0.961987 0.238676 -0.132718\nv -4.771219 6.508766 1.070797   \nvn 0.853713 -0.004825 0.520721\nv 3.717308 2.905019 2.097994   \nvn 0.529250 0.032062 0.847860\nv 2.505210 3.016743 3.295898   \nvn 0.490323 -0.223213 0.842472\nv 2.208448 1.560290 3.216806   \nvn 0.345749 -0.482295 0.804891\nv 3.346783 1.012540 2.119951   \nvn 0.529361 0.134908 0.837602\nv 2.653503 3.261220 3.175738   \nvn 0.676011 0.093950 0.730878\nv -2.359636 5.827519 2.402297   \nvn 0.066162 0.093573 0.993412\nv -1.952693 0.558102 2.853307   \nvn -0.641106 0.272968 -0.717266\nv -0.321562 9.414885 -1.187501   \nvn 0.586235 -0.338159 0.736191\nv 3.138923 1.405072 2.520765   \nvn 0.292770 -0.252318 0.922292\nv 1.493728 1.780051 3.621969   \nvn 0.557023 -0.474180 0.681820\nv 3.018170 0.907291 2.336909   \nvn 0.593778 -0.391397 0.703019\nv 3.183548 1.185297 2.352175   \nvn 0.182169 0.369734 0.911104\nv 1.608619 5.006753 2.695131   \nvn -0.972382 0.094777 -0.213282\nv -4.723919 6.836107 1.095288   \nvn 0.669011 0.019803 0.742989\nv -1.017586 8.865429 -0.149328   \nvn 0.855484 -0.456949 -0.243609\nv 4.730762 1.214014 0.640080   \nvn 0.831549 0.466527 0.301460\nv -2.135182 6.647907 1.495471   \nvn 0.690551 0.384937 0.612343\nv -2.420382 6.546114 2.108209   \nvn 0.854202 0.175697 0.489356\nv -2.458053 7.186346 1.896623   \nvn 0.343978 -0.924358 0.165050\nv 3.437124 0.275798 1.138203   \nvn 0.658593 0.215058 0.721114\nv 0.095925 8.725832 -0.926481   \nvn 0.551709 -0.192497 0.811519\nv 2.417376 2.429869 3.287659   \nvn 0.471931 -0.386349 0.792475\nv 2.279951 1.200317 3.049994   \nvn 0.599484 -0.166522 0.782872\nv 2.674753 2.326926 3.044059   \nvn 0.849458 0.304280 0.431086\nv -2.328123 6.849164 1.757510   \nvn 0.101513 0.992471 0.068533\nv -3.418616 7.853407 0.126248   \nvn 0.473782 0.879856 0.037201\nv -3.151587 7.775430 -0.110889   \nvn 0.338721 0.704283 0.623902\nv 2.349144 5.653242 2.058690   \nvn 0.681857 0.306725 0.664072\nv -2.273236 6.085631 2.242888   \nvn -0.981668 0.120990 0.147276\nv -4.560601 4.525342 1.261241   \nvn 0.534214 0.189794 0.823768\nv 2.866334 3.796067 2.934717   \nvn 0.774515 0.454863 0.439576\nv -2.174930 6.505518 1.791367   \nvn 0.644871 0.059141 0.762000\nv 3.120590 3.283157 2.818869   \nvn 0.630763 0.119782 0.766675\nv 3.037703 3.562356 2.866653   \nvn 0.716789 0.362937 0.595391\nv 0.066233 9.488418 -1.248237   \nvn 0.605330 -0.357287 0.711282\nv 2.749941 0.975018 2.573371   \nvn 0.694144 0.179978 0.696973\nv -2.155749 5.801033 2.204009   \nvn 0.732821 0.411379 0.541978\nv -2.162778 6.261889 2.028596   \nvn 0.253159 -0.302745 0.918834\nv 1.936874 0.459142 2.956718   \nvn 0.642843 0.394998 0.656300\nv 3.176249 4.335541 2.440447   \nvn 0.599647 -0.523409 0.605364\nv 4.356599 1.029423 1.700589   \nvn 0.916888 0.052478 0.395680\nv 3.873502 3.082678 1.804310   \nvn 0.544032 0.391881 0.741929\nv 2.895489 4.243034 2.735259   \nvn 0.634003 0.373521 0.677143\nv -0.095774 9.468195 -1.074510   \nvn 0.052134 -0.768734 -0.637441\nv -1.124982 7.886808 -0.480851   \nvn 0.630532 -0.021431 0.775867\nv 3.032304 3.065454 2.897927   \nvn 0.892933 0.444724 0.069940\nv 3.692687 4.596100 0.957858   \nvn -0.332275 0.098329 -0.938043\nv -3.013045 3.807235 -1.098381   \nvn 0.632092 0.141159 0.761928\nv -0.790012 8.929120 -0.367572   \nvn 0.361471 -0.313181 0.878212\nv 1.905793 0.731790 2.996728   \nvn 0.818239 0.096373 0.566742\nv 3.530396 3.426233 2.356583   \nvn 0.401819 -0.190233 0.895741\nv 2.122990 0.624933 2.929167   \nvn 0.776987 0.259107 0.573720\nv -2.069196 6.039284 2.012510   \nvn 0.068887 0.636707 0.768023\nv -3.565623 7.182525 2.850039   \nvn 0.598994 -0.116127 0.792288\nv 2.959264 2.376337 2.829242   \nvn 0.581147 -0.163249 0.797256\nv 2.949071 1.822483 2.793933   \nvn 0.419794 -0.718189 0.554958\nv 4.036142 0.763803 1.703744   \nvn 0.802058 0.365361 0.472456\nv -1.993527 6.180318 1.804936   \nvn 0.146644 0.326853 0.933629\nv -0.030987 0.766389 3.344766   \nvn 0.674901 0.402936 0.618184\nv -0.549683 8.225193 -0.189341   \nvn 0.323926 0.629853 0.705944\nv -0.765469 8.272246 -0.127174   \nvn 0.910932 0.394778 -0.119810\nv -2.947047 7.541648 -0.414113   \nvn 0.770862 0.617736 0.155480\nv -3.050327 9.101140 -3.435619   \nvn 0.734246 -0.033535 0.678054\nv 3.488566 2.231807 2.399836   \nvn 0.755381 0.441120 0.484575\nv 3.352283 4.727851 1.946438   \nvn 0.703684 0.427938 0.567184\nv 4.741011 2.162773 1.499574   \nvn 0.555294 0.610296 0.564966\nv -1.815093 6.072079 1.580722   \nvn -0.762716 0.585320 0.275072\nv -3.720969 8.267927 -0.984713   \nvn 0.376383 0.341035 0.861412\nv 1.932826 3.714052 3.427488   \nvn 0.739922 0.388073 0.549468\nv 3.323617 4.438961 2.207320   \nvn 0.767219 0.334040 0.547533\nv 0.254111 9.263640 -1.373244   \nvn -0.129230 -0.644453 -0.753644\nv -1.493384 7.868585 -0.450051   \nvn -0.209548 0.479473 -0.852171\nv -0.841901 0.776135 -1.619467   \nvn -0.181386 0.930332 -0.318719\nv 0.243537 6.027668 0.091687   \nvn 0.021531 -0.990730 0.134130\nv 0.303057 0.313022 -0.531105   \nvn -0.106932 -0.030402 0.993801\nv -0.435273 0.474098 3.481552   \nvn 0.441235 -0.107984 0.890871\nv 2.121507 2.622389 3.486293   \nvn 0.434700 -0.399835 0.806950\nv 1.961940 1.101753 3.159584   \nvn 0.955460 0.112612 0.272789\nv 3.937991 3.407551 1.551392   \nvn 0.025520 -0.999073 0.034680\nv 0.070906 0.295753 1.377185   \nvn 0.605396 0.066939 0.793105\nv -1.935880 7.631764 0.651674   \nvn -0.512707 0.393472 -0.763093\nv -2.523531 0.744818 -0.309850   \nvn 0.576730 0.105584 0.810083\nv 2.891496 3.319875 2.983079   \nvn 0.877866 -0.214600 0.428133\nv 4.781765 1.547061 1.523129   \nvn 0.694295 0.486393 0.530450\nv -2.256064 7.571251 0.973716   \nvn 0.714879 -0.029231 0.698637\nv 3.244861 3.058249 2.724392   \nvn 0.226358 0.027846 0.973646\nv -0.145855 0.437775 3.433662   \nvn 0.145243 0.615625 0.774539\nv 1.586296 5.658538 2.358487   \nvn 0.850461 0.196719 0.487871\nv 3.658336 3.774921 2.071837   \nvn 0.486330 0.457914 0.744176\nv 2.840463 4.817098 2.463760   \nvn -0.274697 -0.424934 -0.862538\nv -1.219464 8.122542 -0.672808   \nvn -0.089344 -0.504561 -0.858741\nv -2.520906 2.664486 -1.034346   \nvn -0.444342 -0.034674 -0.895186\nv -1.315417 8.471365 -0.709557   \nvn 0.763937 0.168770 0.622829\nv 3.429165 3.746860 2.446169   \nvn 0.633137 0.222177 0.741468\nv 3.074579 3.840758 2.767409   \nvn 0.805819 0.016236 0.591939\nv 3.569443 3.166337 2.333647   \nvn 0.412520 0.197667 0.889244\nv 2.294337 3.280051 3.359346   \nvn 0.377891 0.298179 0.876520\nv 2.218160 3.665780 3.269222   \nvn 0.247991 0.412198 -0.876694\nv 2.158662 4.151444 -1.357919   \nvn 0.141880 0.541143 -0.828875\nv 1.138620 4.380986 -1.404565   \nvn 0.754054 -0.081004 -0.651798\nv 3.388382 2.749931 -0.840949   \nvn 0.663040 0.530220 0.528436\nv 3.059892 5.084848 2.026066   \nvn 0.612580 -0.080244 0.786325\nv 3.204739 2.075145 2.640706   \nvn 0.542211 -0.249425 0.802368\nv 3.387065 1.426170 2.305275   \nvn 0.871263 0.110359 0.478249\nv 3.910398 2.670742 1.750179   \nvn 0.709097 -0.134343 0.692194\nv 3.471512 1.945821 2.395881   \nvn 0.428065 -0.452375 0.782379\nv 4.080820 1.070654 1.960171   \nvn 0.296770 -0.954928 -0.006318\nv -1.057861 0.133036 2.146707   \nvn -0.074501 0.805856 -0.587406\nv -0.151749 5.535510 -0.624323   \nvn 0.674106 0.313852 0.668639\nv 3.233099 4.003778 2.571172   \nvn 0.485948 0.611880 -0.624065\nv 2.611726 5.319199 -0.499388   \nvn 0.642290 -0.472884 -0.603194\nv 2.682909 1.094499 -1.206247   \nvn 0.464258 -0.868259 0.174903\nv -1.228230 7.656887 0.041409   \nvn 0.332008 -0.169423 -0.927937\nv -2.293247 7.259189 0.013844   \nvn 0.210175 -0.747114 0.630592\nv 0.081315 0.202174 3.286381   \nvn 0.170297 0.893185 -0.416196\nv -1.002038 5.794454 -0.187194   \nvn 0.780925 0.306415 0.544303\nv 3.448856 4.080910 2.258325   \nvn -0.025320 -0.494167 -0.868998\nv 0.287883 9.006888 -1.550641   \nvn -0.604558 0.173163 -0.777511\nv -3.851019 4.059839 -0.646922   \nvn 0.836233 0.311356 0.451410\nv 3.610966 4.205438 1.913129   \nvn 0.414405 0.067298 0.907601\nv 2.239042 2.950872 3.449959   \nvn 0.260214 -0.082185 0.962047\nv 0.216305 0.442843 3.328052   \nvn 0.365200 -0.089527 0.926614\nv 1.871410 2.470745 3.574559   \nvn 0.889056 -0.022799 -0.457230\nv 3.811378 2.768718 -0.228364   \nvn 0.545017 -0.315259 0.776897\nv 2.511081 1.362724 2.969349   \nvn 0.506646 0.003244 0.862148\nv -1.598130 7.866506 0.440184   \nvn -0.472691 -0.357872 -0.805289\nv -3.307975 2.851072 -0.894978   \nvn 0.516788 0.345113 0.783471\nv -0.107011 8.905730 -0.884399   \nvn -0.682590 -0.355594 -0.638454\nv -3.855315 2.842597 -0.434541   \nvn 0.546941 -0.360434 0.755607\nv 2.517853 1.090768 2.799687   \nvn 0.785127 0.112660 0.609002\nv 3.791709 2.366850 2.002703   \nvn 0.936900 0.237548 -0.256494\nv 4.062940 2.773922 0.452723   \nvn 0.985060 0.166873 -0.042536\nv -2.973289 7.617030 -0.623653   \nvn 0.946063 0.318126 0.061327\nv -2.955090 8.924462 -3.446319   \nvn 0.590316 -0.609273 0.529446\nv 2.861402 0.562592 2.184397   \nvn 0.587460 0.171530 0.790865\nv -1.109725 8.594206 -0.076812   \nvn 0.361043 -0.876315 -0.318937\nv -0.725722 7.924485 -0.381133   \nvn -0.082336 0.018574 -0.996432\nv -1.485587 1.329994 -0.654405   \nvn -0.871745 -0.344477 0.348419\nv -4.342113 3.233735 1.752922   \nvn 0.990282 -0.090028 -0.106000\nv -2.968049 7.955519 -2.094050   \nvn -0.652536 0.551252 0.519922\nv -3.130948 0.446196 0.852870   \nvn -0.994386 -0.073390 0.076227\nv -4.958475 5.757329 1.447055   \nvn 0.724473 -0.664032 -0.184934\nv -3.086547 7.615193 -1.953168   \nvn -0.164931 -0.425761 0.889677\nv -3.751923 5.412821 3.373373   \nvn -0.659127 0.683542 0.313564\nv -4.599645 7.480953 1.677134   \nvn -0.242108 -0.956741 -0.161338\nv 1.133992 0.274871 0.032249   \nvn 0.966600 0.255881 0.014483\nv -2.956512 8.126905 -1.785461   \nvn -0.091744 0.459181 -0.883593\nv -0.960645 4.730650 -1.191786   \nvn -0.710326 0.699015 0.082549\nv -2.871064 0.875559 0.424881   \nvn -0.985461 0.108723 0.130557\nv -4.932114 5.996140 1.483845   \nvn 0.896586 0.413832 0.157726\nv -2.981761 8.124612 -1.387276   \nvn 0.981881 -0.187687 0.026156\nv 0.362298 8.978545 -1.368024   \nvn -0.930014 -0.343895 -0.129654\nv -4.408375 3.046271 0.602373   \nvn 0.650262 -0.087590 -0.754644\nv 2.865841 2.322263 -1.344625   \nvn -0.904755 -0.114740 -0.410187\nv -4.784800 5.620895 0.594432   \nvn -0.820471 0.383633 -0.423856\nv -2.883220 0.338931 1.672310   \nvn -0.985237 0.101849 0.137607\nv -4.688101 6.772931 1.872318   \nvn -0.966474 0.245842 -0.074098\nv -4.903948 6.164698 1.271350   \nvn 0.709836 -0.523312 -0.471463\nv 2.856630 1.005647 -0.906843   \nvn 0.256683 -0.874702 -0.411108\nv 2.691286 0.209811 0.050512   \nvn -0.905944 0.294621 -0.304080\nv -4.693636 6.477556 0.665796   \nvn -0.823560 0.270033 -0.498830\nv -4.472331 6.861067 0.477318   \nvn 0.050372 -0.832033 0.552434\nv 0.883065 0.204907 3.073933   \nvn -0.006567 -0.594148 -0.804329\nv -0.995867 8.048729 -0.653897   \nvn 0.035454 0.852802 -0.521029\nv -0.794663 5.670397 -0.390119   \nvn 0.748942 -0.327976 -0.575775\nv 3.313153 1.638006 -0.722289   \nvn -0.940558 -0.319464 -0.115300\nv -4.856459 5.394758 1.032591   \nvn 0.986594 0.157644 0.042196\nv -3.005448 7.783023 -0.819641   \nvn 0.688043 -0.112896 -0.716834\nv 3.118910 2.036974 -1.086890   \nvn -0.162160 -0.510961 0.844170\nv -2.364319 2.408419 2.634190   \nvn 0.999653 -0.019602 -0.017572\nv -2.927132 8.754350 -3.537159   \nvn -0.307294 -0.748362 -0.587813\nv -3.296222 7.964629 -3.134625   \nvn -0.090221 0.132308 -0.987094\nv -1.642041 4.134170 -1.301665   \nvn 0.468402 -0.754279 -0.460069\nv 2.030759 0.176372 -1.030923   \nvn -0.963999 -0.149943 -0.219598\nv -4.559069 3.751053 0.548453   \nvn 0.780902 0.465313 -0.416744\nv 3.438385 4.594540 -0.243215   \nvn -0.589095 0.652448 -0.476737\nv -2.561769 7.939350 0.177696   \nvn 0.746296 -0.370863 -0.552723\nv 2.990593 1.335314 -0.943177   \nvn -0.254728 -0.959903 0.117043\nv 1.280800 0.276396 -0.490720   \nvn 0.059543 -0.997360 -0.041559\nv -0.318889 0.290684 0.211143   \nvn 0.810681 0.091432 -0.578306\nv 3.546140 3.342635 -0.767878   \nvn 0.859456 -0.474852 -0.189342\nv -3.073372 7.780018 -2.357807   \nvn -0.937810 0.152401 -0.311907\nv -4.455388 4.387245 0.361038   \nvn -0.906202 0.237736 0.349685\nv -4.659393 6.276064 2.767014   \nvn 0.057042 0.479343 -0.875772\nv 0.636799 4.482223 -1.426284   \nvn 0.986941 -0.156671 -0.037447\nv -2.987681 8.072969 -2.452450   \nvn -0.615910 0.729205 -0.298185\nv -2.610445 0.763554 1.792054   \nvn 0.754091 -0.166715 -0.635258\nv 3.358241 2.006707 -0.802973   \nvn 0.194553 -0.980528 -0.026724\nv -0.498347 0.251594 0.962885   \nvn 0.484338 -0.537959 0.689940\nv 3.132200 0.683312 2.038777   \nvn -0.644168 0.646086 -0.409415\nv -4.389801 7.493776 0.690247   \nvn -0.039993 0.698258 -0.714728\nv 0.431467 4.221190 -1.614215   \nvn -0.931932 -0.269634 -0.242487\nv -4.376181 3.213141 0.273255   \nvn -0.969838 -0.040320 -0.240392\nv -4.872319 5.715645 0.829714   \nvn -0.956296 0.182537 -0.228426\nv -4.826893 6.195334 0.849912   \nvn 0.779099 -0.082145 -0.621496\nv 3.516562 2.237320 -0.677597   \nvn 0.725455 -0.255804 -0.638968\nv 3.131656 1.698841 -0.975761   \nvn -0.896417 -0.441270 0.041450\nv -4.754925 5.411666 1.989303   \nvn 0.887439 -0.241892 -0.392353\nv -2.987299 7.320765 -0.629479   \nvn -0.599410 -0.151914 -0.785894\nv -3.757635 3.274862 -0.744022   \nvn 0.782650 -0.010828 -0.622368\nv 3.487044 2.541999 -0.699933   \nvn -0.983819 0.031158 -0.176436\nv -4.532740 4.649505 0.770930   \nvn -0.060017 -0.972590 0.224650\nv -1.424192 0.099423 2.633327   \nvn 0.686178 -0.055901 -0.725283\nv 3.090867 2.476975 -1.146957   \nvn -0.599758 0.798150 -0.056983\nv -2.713256 0.815622 2.173110   \nvn 0.666231 -0.026478 -0.745275\nv 3.348121 3.254167 -0.984896   \nvn -0.473388 -0.608928 -0.636483\nv -3.031379 0.164530 -0.309937   \nvn -0.182400 0.340201 -0.922493\nv -0.949757 4.518137 -1.309172   \nvn 0.248569 -0.966240 0.067780\nv -0.889509 0.095256 1.288803   \nvn 0.802905 -0.214441 -0.556200\nv 3.539594 1.966105 -0.553965   \nvn -0.893254 0.148129 -0.424447\nv -4.606120 7.127749 0.811958   \nvn -0.870405 -0.428635 0.242211\nv -2.332953 1.444713 1.624548   \nvn 0.656340 -0.032770 -0.753753\nv 3.136293 2.958050 -1.138272   \nvn 0.778494 -0.131426 -0.613739\nv 3.540808 3.069058 -0.735285   \nvn 0.850229 -0.059246 -0.523068\nv 3.678852 2.362375 -0.452543   \nvn -0.867266 0.344001 -0.359879\nv -4.648898 7.374380 0.954791   \nvn -0.193227 -0.729543 0.656072\nv -0.646871 0.190370 3.344746   \nvn 0.665642 -0.674747 -0.318804\nv 2.282500 0.293430 -0.826273   \nvn -0.801452 0.282025 -0.527387\nv -4.422291 7.183959 0.557517   \nvn -0.795827 -0.601052 0.073459\nv -4.694668 5.246103 2.541768   \nvn -0.962373 0.083124 -0.258705\nv -4.583691 4.145486 0.600207   \nvn 0.994093 -0.103982 0.031093\nv -2.934854 7.912513 -1.539269   \nvn 0.821566 0.546735 0.161586\nv -3.067861 7.817472 -0.546501   \nvn 0.908653 -0.013269 -0.417342\nv 3.825095 3.229512 -0.237547   \nvn 0.611007 -0.723951 0.320258\nv 2.532494 0.323059 2.387105   \nvn -0.689627 0.689778 0.220501\nv -2.514583 0.692857 1.235970   \nvn -0.984552 0.140946 -0.103884\nv -4.736805 7.214384 1.259421   \nvn 0.976722 0.167460 0.134057\nv -2.980710 8.409903 -2.468199   \nvn 0.676045 -0.275516 -0.683413\nv 2.621468 1.385844 -1.406355   \nvn 0.908123 0.125317 0.399511\nv 3.811447 3.560855 1.847828   \nvn 0.627335 -0.252896 -0.736542\nv 3.432925 1.497205 -0.489784   \nvn 0.859658 0.167758 -0.482540\nv 3.746609 3.631538 -0.390670   \nvn 0.841490 -0.064981 -0.536351\nv 3.594909 2.832257 -0.576012   \nvn -0.085317 0.679116 -0.729056\nv -0.404192 5.300188 -0.856561   \nvn -0.966347 0.223482 0.127396\nv -4.762996 6.483774 1.702648   \nvn -0.997557 0.064032 0.027930\nv -4.756612 6.786223 1.436820   \nvn 0.988742 0.148951 0.014250\nv -2.965309 8.437217 -2.785495   \nvn 0.570062 -0.590254 -0.571515\nv 2.863867 0.740870 -0.429684   \nvn 0.960130 0.162636 0.227377\nv 4.025030 2.968753 1.392419   \nvn 0.707658 -0.060620 -0.703949\nv 3.669036 1.833858 -0.304971   \nvn -0.601453 0.687150 0.407528\nv -2.888864 0.720537 0.778057   \nvn -0.860322 0.400742 0.315043\nv -2.369820 0.979443 1.054447   \nvn 0.996546 -0.080360 -0.020946\nv -2.959259 8.222303 -2.659724   \nvn -0.613196 -0.767943 -0.185080\nv -3.467825 7.545739 -2.333445   \nvn 0.630660 -0.518167 -0.577730\nv 2.153426 0.446256 -1.205230   \nvn -0.330742 0.342198 -0.879494\nv -3.229807 9.189699 -3.596609   \nvn -0.321006 0.868079 0.378674\nv -3.724860 8.773707 -2.046671   \nvn 0.865527 0.007459 -0.500807\nv 3.687218 3.297751 -0.523746   \nvn -0.008237 -0.929808 -0.367952\nv 1.381025 0.088150 -1.185668   \nvn 0.671398 0.125567 -0.730382\nv -2.796828 7.205622 -0.208783   \nvn 0.846358 0.297688 -0.441655\nv 3.647194 4.066232 -0.291507   \nvn -0.954912 -0.035432 0.294768\nv -4.578376 3.885556 1.525460   \nvn -0.723721 0.623530 -0.295700\nv -2.840262 0.630940 1.894990   \nvn -0.739859 0.647211 -0.183646\nv -2.429514 0.922118 1.820781   \nvn -0.951559 0.226694 0.207712\nv -4.675079 6.573925 2.423363   \nvn 0.460618 0.363018 -0.809969\nv 2.806207 4.320188 -1.027372   \nvn 0.045042 -0.997695 -0.050750\nv -1.289608 0.097241 1.321661   \nvn 0.948248 -0.296702 -0.113107\nv -3.010731 8.141334 -2.866148   \nvn 0.677910 -0.453001 -0.578989\nv 3.202291 1.235617 -0.549025   \nvn 0.688352 0.468749 -0.553576\nv 4.094792 2.477519 0.304581   \nvn 0.726018 -0.539424 -0.426520\nv 2.948403 0.966873 -0.664857   \nvn -0.993998 0.050245 0.097178\nv -4.832970 5.920587 2.095461   \nvn 0.932185 0.163731 0.322836\nv -2.169693 7.257277 0.946184   \nvn -0.436991 -0.193974 -0.878301\nv -1.335807 3.057597 -1.303166   \nvn -0.232289 0.591556 -0.772077\nv -1.037877 0.641510 -1.685271   \nvn 0.074678 -0.993879 -0.081406\nv 2.627919 0.089814 0.439074   \nvn 0.912823 0.223234 0.341937\nv 3.815794 3.808102 1.730493   \nvn 0.999392 -0.033859 0.008282\nv -2.973455 8.433141 -3.088720   \nvn 0.922890 0.215807 0.318906\nv -2.391558 7.331428 1.658264   \nvn -0.849351 0.140382 0.508817\nv -4.333107 4.529978 1.850516   \nvn -0.989655 -0.121215 0.076743\nv -4.640293 3.767107 1.168841   \nvn 0.855384 0.390281 0.340587\nv 3.600716 4.469310 1.734024   \nvn 0.426708 0.202832 -0.881351\nv 3.880803 1.730158 -0.172736   \nvn 0.935830 0.328860 0.126779\nv 3.814183 4.262372 1.167042   \nvn 0.654566 -0.697699 0.291135\nv 4.373250 0.829542 1.413729   \nvn 0.491900 0.795207 -0.354515\nv 2.490447 5.751110 0.011492   \nvn 0.835128 0.542382 0.091558\nv 3.460003 4.962436 1.188971   \nvn 0.953867 0.238108 0.182873\nv 3.918419 3.814234 1.358271   \nvn -0.450946 0.032310 -0.891966\nv -0.807595 8.840504 -0.953711   \nvn 0.914746 0.309972 0.259149\nv 3.752855 4.205770 1.571770   \nvn 0.934080 0.259206 0.245574\nv -2.991085 8.816501 -3.244595   \nvn 0.929801 0.199502 0.309303\nv -2.333196 7.128889 1.551985   \nvn 0.982370 0.113866 0.148270\nv 3.977718 3.570941 1.259370   \nvn 0.646922 -0.757437 0.088206\nv 4.360071 0.755579 1.079916   \nvn 0.796701 -0.602832 0.043134\nv 4.637579 1.027973 1.032567   \nvn 0.886880 0.370355 0.276190\nv -2.317000 7.421066 1.329589   \nvn -0.176773 -0.347705 -0.920789\nv -1.013404 8.293662 -0.782300   \nvn 0.734533 -0.618310 0.279561\nv 4.548023 1.020644 1.420462   \nvn 0.885380 -0.413274 0.212853\nv 4.763258 1.266798 1.296203   \nvn 0.947968 0.179930 0.262646\nv 4.896000 2.073084 1.255213   \nvn 0.991518 0.107473 0.073087\nv 4.015005 3.325226 1.093879   \nvn 0.999811 0.011306 0.015829\nv 4.948850 1.860936 0.894463   \nvn 0.916195 0.292533 0.273881\nv -2.189645 6.954634 1.270077   \nvn 0.969106 -0.143962 0.200272\nv 4.887442 1.720992 1.288526   \nvn -0.002864 0.998663 -0.051620\nv -3.184068 7.871802 0.956189   \nvn -0.478958 0.759318 -0.440495\nv -1.274318 0.839887 -1.224389   \nvn -0.103073 0.989484 -0.101479\nv -2.919521 7.844320 0.541629   \nvn 0.183835 0.937143 0.296593\nv -2.994586 7.766102 1.968670   \nvn 0.341106 0.825114 0.450370\nv -3.417504 9.241714 -3.093201   \nvn 0.331691 0.601726 0.726572\nv -3.174563 7.466456 2.473617   \nvn 0.659932 0.639277 0.394734\nv -3.263067 9.069412 -3.003459   \nvn -0.701009 0.550746 0.453063\nv -2.841592 0.529833 2.693434   \nvn 0.089283 0.909845 0.405229\nv -3.611069 9.158804 -2.829871   \nvn -0.861018 0.038536 -0.507112\nv -4.642828 5.927526 0.320549   \nvn -0.542036 0.761364 0.355699\nv -3.809308 9.051035 -2.692749   \nvn 0.470537 0.550425 -0.689657\nv -2.837582 7.487987 -0.106206   \nvn 0.696295 0.662360 0.276498\nv 4.773025 2.330442 1.213899   \nvn 0.927075 0.373410 -0.033124\nv 4.897435 2.209906 0.966657   \nvn 0.857090 0.429111 0.285063\nv -3.067637 8.164062 -1.126610   \nvn 0.817275 0.468853 0.335020\nv -3.122129 8.080740 -0.899194   \nvn 0.320715 0.814227 0.483917\nv 4.571019 2.358113 1.462054   \nvn 0.442305 0.873810 -0.202046\nv 4.584884 2.454418 0.709466   \nvn -0.602364 -0.541211 -0.586727\nv -3.661093 7.146581 -0.475948   \nvn 0.641965 0.763376 -0.071679\nv 4.735131 2.415859 0.933939   \nvn 0.600336 0.744937 0.290972\nv 4.207556 2.540018 1.218293   \nvn -0.224314 0.945081 0.237708\nv -3.607595 7.891610 -0.121172   \nvn -0.526584 0.732140 -0.432065\nv -1.527952 0.775564 -1.061903   \nvn 0.306163 0.943782 0.124657\nv 4.538740 2.503273 1.099583   \nvn -0.789971 0.559093 -0.251715\nv -3.938837 7.587988 0.082449   \nvn -0.973515 0.151119 0.171556\nv -4.853582 6.152409 1.787943   \nvn -0.970211 0.212882 0.115639\nv -4.752214 6.247234 2.296873   \nvn 0.416921 0.774618 -0.475546\nv 4.602935 2.363955 0.488901   \nvn 0.714801 0.694521 0.081854\nv -1.816380 6.365879 0.868272   \nvn -0.005528 0.399950 -0.916520\nv 0.595467 4.744074 -1.324830   \nvn 0.429878 0.290350 -0.854928\nv 1.876350 3.511986 -1.842924   \nvn 0.527062 0.830523 -0.180105\nv 4.330947 2.534326 0.720503   \nvn 0.907709 0.418701 0.027468\nv 4.108736 2.750805 0.904552   \nvn -0.701653 0.337011 -0.627779\nv -1.890939 8.492628 -0.290768   \nvn -0.195517 0.093070 -0.976274\nv -3.504309 6.173058 -0.422804   \nvn 0.589945 0.793771 -0.147961\nv -1.611992 6.196732 0.648736   \nvn -0.234886 0.972018 -0.003074\nv -3.899149 7.826123 1.088845   \nvn -0.301455 -0.229777 -0.925380\nv -3.078303 3.008813 -1.035784   \nvn 0.256942 0.957574 0.130510\nv -2.798999 7.844899 1.340061   \nvn 0.257397 0.922910 -0.286329\nv -1.248839 5.959105 0.041761   \nvn 0.047465 0.765587 0.641579\nv 0.767779 4.337318 3.090817   \nvn -0.228431 0.820874 0.523436\nv -3.831177 7.515605 2.432261   \nvn 0.440642 0.849144 -0.291186\nv -1.667528 6.156208 0.365267   \nvn 0.629853 0.769976 0.102093\nv -1.726078 6.237384 1.100059   \nvn -0.674688 0.271333 -0.686421\nv -3.972037 4.520832 -0.370756   \nvn -0.402874 0.902027 0.155048\nv -4.404490 7.636357 1.520425   \nvn 0.315397 0.882405 0.349123\nv -1.345060 6.004054 1.293159   \nvn 0.271582 0.956172 -0.109447\nv -1.233556 6.049933 0.500651   \nvn -0.307571 0.950104 -0.051985\nv -3.696869 7.797320 0.379790   \nvn 0.563332 0.751795 0.342726\nv -3.307798 8.949964 -2.698113   \nvn 0.873746 0.462406 0.150828\nv -1.997295 6.615056 1.103691   \nvn 0.567398 0.748267 0.343739\nv -3.219222 8.336394 -1.150614   \nvn -0.054522 0.873635 0.483518\nv -3.452623 8.318660 -0.941700   \nvn -0.702086 -0.364216 0.611900\nv -3.946410 2.990494 2.212592   \nvn 0.358798 0.832924 0.421310\nv -3.250025 8.030414 -0.596097   \nvn -0.670317 -0.114177 0.733238\nv -2.023750 1.571333 2.397939   \nvn 0.156483 0.820923 0.549180\nv -3.190358 7.665013 2.268183   \nvn 0.499970 0.647206 0.575460\nv -2.811918 7.618526 2.145587   \nvn 0.213639 0.932630 -0.290791\nv -1.005265 5.892303 0.072158   \nvn 0.155348 0.985956 0.061306\nv -0.937210 5.974148 0.906669   \nvn -0.823371 0.565738 0.044725\nv -4.646072 7.492193 1.453120   \nvn -0.726001 -0.188132 0.661460\nv -0.252931 1.797654 3.140638   \nvn 0.114807 0.836767 0.535389\nv -1.076064 5.738433 1.695953   \nvn -0.284802 0.940845 0.183570\nv -3.980534 7.744391 1.735791   \nvn 0.029821 0.991546 -0.126283\nv -0.721187 5.939396 0.526032   \nvn -0.146633 0.955374 -0.256435\nv -0.428180 5.919755 0.229001   \nvn 0.384591 0.918997 0.086801\nv -1.434290 6.116220 0.938630   \nvn 0.215447 0.952645 -0.214595\nv -0.985638 5.939683 0.290636   \nvn -0.571167 0.738248 0.358829\nv -4.433836 7.461372 1.966437   \nvn -0.149579 0.981111 0.122667\nv -3.696398 7.844859 1.547325   \nvn -0.062497 0.976900 0.204353\nv -3.390772 7.820186 1.812204   \nvn 0.012368 0.999625 -0.024446\nv -2.916787 7.864019 0.804341   \nvn -0.547568 0.729161 0.410480\nv -3.715952 8.037269 -0.591341   \nvn -0.391645 0.916686 -0.079377\nv -4.204634 7.729190 1.119866   \nvn -0.832804 -0.141046 -0.535298\nv -4.592233 5.592883 0.246264   \nvn 0.787883 0.537858 0.299914\nv 3.307299 5.061701 1.622917   \nvn -0.025131 0.822715 0.567898\nv -3.515159 7.601467 2.368914   \nvn 0.071065 0.920273 0.384770\nv -3.435742 8.533457 -1.379160   \nvn -0.036684 0.392144 -0.919172\nv -0.269421 4.545635 -1.366445   \nvn -0.251142 0.069958 -0.965419\nv -2.542124 3.768736 -1.258512   \nvn 0.062090 0.997602 0.030576\nv -3.034003 7.873773 1.256854   \nvn 0.144795 0.987786 0.057560\nv -2.801399 7.856028 1.080137   \nvn 0.803262 0.593559 0.049568\nv 3.293540 5.220894 1.081767   \nvn -0.907926 -0.299586 0.293118\nv -2.351090 1.299486 1.012060   \nvn 0.047250 0.951778 0.303129\nv -3.232213 7.768136 2.047563   \nvn 0.791526 0.609785 -0.040606\nv 3.290415 5.217525 0.680190   \nvn -0.069936 0.927374 0.367542\nv -3.415109 7.731034 2.144326   \nvn 0.822862 0.535532 -0.190009\nv 3.440357 4.962463 0.373387   \nvn 0.753726 0.641024 0.144860\nv 3.147346 5.352121 1.386923   \nvn 0.598232 0.658978 0.455924\nv 2.847252 5.469051 1.831981   \nvn 0.729334 0.683361 0.033007\nv 3.137682 5.410222 1.050188   \nvn 0.706174 0.617889 0.345732\nv 3.102694 5.310456 1.676434   \nvn -0.863447 0.447543 -0.232735\nv -3.044601 0.395150 1.994084   \nvn 0.630196 0.740119 0.234684\nv 2.903647 5.561338 1.518598   \nvn -0.959076 0.275900 0.063660\nv -3.810148 8.093598 -0.889131   \nvn 0.539342 -0.699876 0.468277\nv 4.234835 0.803054 1.593271   \nvn 0.761723 0.615968 -0.200903\nv 3.240165 5.228747 0.325955   \nvn 0.679743 0.732503 -0.037267\nv 3.037452 5.509825 0.817137   \nvn 0.545578 0.818370 0.180596\nv 2.635031 5.795187 1.439724   \nvn 0.677096 0.673476 -0.296597\nv 3.071607 5.318303 0.080142   \nvn 0.638852 0.767221 0.056917\nv 2.909167 5.611751 1.155874   \nvn 0.664309 0.732613 -0.148228\nv 3.044889 5.465928 0.486566   \nvn 0.476779 0.802082 0.359646\nv 2.502256 5.770673 1.740054   \nvn -0.050855 -0.938996 0.340146\nv -0.067497 0.086416 -1.190239   \nvn 0.458595 0.826983 -0.325254\nv 2.333260 5.906051 0.138295   \nvn -0.033283 0.746945 0.664052\nv 0.650960 4.205423 3.308767   \nvn -0.457466 0.889133 -0.012909\nv -2.671137 7.936535 0.432731   \nvn 0.378893 0.784624 0.490720\nv 2.144630 5.879214 1.866047   \nvn -0.919755 0.048864 -0.389440\nv -4.776469 5.890689 0.561986   \nvn 0.595472 0.771232 -0.224976\nv 2.724320 5.655145 0.211951   \nvn 0.584582 0.807346 -0.080353\nv 2.730488 5.751455 0.695894   \nvn 0.547419 0.835817 0.041750\nv 2.572682 5.869295 1.152663   \nvn 0.301988 0.688394 0.659482\nv 1.906776 5.739123 2.196551   \nvn 0.464454 0.882840 -0.069826\nv 2.344414 5.999961 0.772922   \nvn -0.093823 -0.967055 -0.236647\nv -3.377905 7.448708 -1.863251   \nvn 0.433262 0.869439 0.237401\nv 2.285149 5.968156 1.459258   \nvn 0.511498 0.845834 -0.151444\nv 2.385989 5.928974 0.368900   \nvn 0.370423 0.928662 -0.019315\nv 2.192111 6.087516 0.959901   \nvn 0.470832 0.877547 0.090713\nv 2.363720 6.001101 1.074346   \nvn 0.355737 0.886067 0.297214\nv 1.972022 6.079603 1.591175   \nvn 0.271228 0.825817 0.494431\nv 1.876150 5.976698 1.915540   \nvn -0.932051 0.010996 -0.362160\nv -3.824761 9.053720 -2.928615   \nvn 0.365520 0.922247 0.125917\nv 2.044704 6.129704 1.263111   \nvn -0.438900 0.820494 0.366274\nv -2.583046 0.849537 2.497344   \nvn -0.477319 -0.295532 0.827543\nv -0.078825 2.342205 3.520322   \nvn -0.386521 0.078720 0.918915\nv -0.704686 0.537165 3.397194   \nvn -0.377464 0.156517 0.912701\nv -0.257449 3.235334 3.647545   \nvn -0.685161 -0.020613 0.728100\nv -0.332064 1.448284 3.022583   \nvn -0.526835 0.224347 -0.819825\nv -2.200146 0.898284 -0.447212   \nvn -0.475572 -0.756262 0.449332\nv -2.497508 1.745446 1.829167   \nvn -0.154513 0.573667 0.804383\nv 0.307020 4.416315 2.978956   \nvn -0.353352 -0.026967 -0.935102\nv -3.205197 3.479307 -1.040582   \nvn -0.344314 0.082794 -0.935197\nv 0.110069 9.347725 -1.563686   \nvn -0.459728 0.667426 0.585827\nv -0.827540 0.883886 3.065838   \nvn -0.595706 0.256852 0.761027\nv -2.017103 1.244785 2.425120   \nvn -0.739782 -0.299130 0.602697\nv -0.421091 2.309929 3.153898   \nvn -0.524615 0.453590 0.720441\nv -0.491604 3.796072 3.162450   \nvn 0.509638 0.171702 -0.843082\nv 2.786955 3.501241 -1.340214   \nvn -0.419097 0.261882 -0.869353\nv -3.229055 4.380713 -0.899241   \nvn 0.279854 -0.619472 0.733441\nv 3.730768 0.768450 1.903120   \nvn -0.761608 -0.310733 0.568682\nv -0.561079 2.652382 3.152463   \nvn -0.482628 -0.341947 0.806314\nv -3.461471 3.086496 2.662505   \nvn -0.743321 0.156497 0.650371\nv -0.661405 3.446009 3.179939   \nvn -0.573081 0.356975 0.737663\nv -0.915351 0.636755 3.243708   \nvn 0.612042 0.402505 -0.680730\nv -2.992964 8.915628 -3.729833   \nvn -0.630918 0.352855 0.690968\nv -0.439627 3.502104 3.426650   \nvn -0.313918 0.527838 0.789204\nv -1.154217 0.883181 2.800835   \nvn -0.428049 -0.031021 0.903223\nv -1.736193 1.465474 2.595489   \nvn -0.663192 0.014147 0.748315\nv -0.423928 3.244350 3.548277   \nvn -0.759014 -0.256957 0.598223\nv -0.511153 2.871046 3.379749   \nvn -0.796020 -0.135405 0.589930\nv -0.675722 2.991756 3.143262   \nvn -0.601430 0.425792 0.676006\nv -1.092602 0.599103 3.090639   \nvn -0.519206 -0.227378 0.823847\nv -0.898210 2.836952 2.840023   \nvn -0.612781 0.618304 0.492139\nv -2.658412 0.781376 0.960575   \nvn -0.992485 -0.089002 0.083972\nv -2.271455 1.222857 1.330478   \nvn -0.366945 0.691022 0.622767\nv -0.877861 1.111222 2.722630   \nvn -0.514253 -0.213217 0.830712\nv -0.306959 2.876987 3.556044   \nvn -0.998452 -0.054571 0.010730\nv -3.839274 7.841380 -0.918404   \nvn -0.334402 0.568269 0.751828\nv -0.172094 4.083799 3.141708   \nvn -0.312911 -0.267721 0.911269\nv -1.548332 0.252900 2.864655   \nvn -0.058935 0.485538 -0.872227\nv -0.217353 4.873911 -1.223104   \nvn -0.462923 -0.186403 -0.866577\nv -3.384242 3.181056 -0.955790   \nvn -0.627530 0.025863 0.778162\nv -2.731704 0.382421 2.895502   \nvn -0.478626 0.310591 0.821249\nv -1.285037 0.551267 2.947675   \nvn -0.234777 0.678827 0.695754\nv 0.077224 4.246579 3.066738   \nvn -0.716323 -0.071516 0.694095\nv -0.479979 1.779550 2.860011   \nvn -0.414636 0.342115 0.843228\nv -0.716375 1.224694 2.666751   \nvn -0.797596 -0.012343 0.603066\nv -0.546220 3.138255 3.393457   \nvn -0.676145 -0.501826 0.539443\nv -2.334130 1.821222 2.124883   \nvn -0.753536 -0.217305 0.620453\nv -0.506530 2.037147 2.897465   \nvn 0.460263 -0.417811 -0.783321\nv 2.451291 1.211389 -1.466589   \nvn -0.374094 -0.409383 0.832142\nv -3.160047 2.894081 2.724286   \nvn -0.391970 -0.396684 0.830061\nv -4.137258 5.433431 3.212010   \nvn -0.001892 -0.999917 -0.012781\nv 0.462896 0.320456 -0.174837   \nvn -0.678773 -0.347253 0.647057\nv -0.374580 2.609447 3.379253   \nvn -0.979624 -0.169973 0.106989\nv -3.095244 0.256205 2.196446   \nvn -0.476132 -0.207257 0.854601\nv -4.197985 5.732991 3.262924   \nvn 0.190881 -0.975833 -0.106367\nv -0.729747 0.246036 0.497036   \nvn -0.199022 0.414150 -0.888183\nv -2.356189 5.062000 -0.965619   \nvn -0.774802 0.184432 -0.604704\nv -1.609036 0.259620 -1.487367   \nvn -0.367769 0.046660 0.928746\nv -4.074381 6.074061 3.409459   \nvn -0.518429 0.150395 0.841791\nv -3.619304 4.002200 2.657050   \nvn -0.373505 -0.182219 -0.909555\nv -0.543393 8.742896 -1.056622   \nvn -0.562418 0.525147 0.638675\nv -4.303560 6.858934 2.879642   \nvn -0.676057 0.029461 -0.736260\nv -0.716688 2.901831 -2.112020   \nvn -0.098822 -0.995002 0.014305\nv 1.547362 0.083189 1.138764   \nvn 0.066101 -0.997502 0.024908\nv -0.250916 0.275268 1.201344   \nvn -0.635204 -0.300270 0.711585\nv -3.778035 3.136240 2.466177   \nvn -0.680305 -0.128794 0.721524\nv -4.594316 5.771342 3.016940   \nvn -0.573768 -0.133742 0.808024\nv -3.717706 3.442887 2.603344   \nvn -0.469680 -0.533144 0.703675\nv -4.311163 5.224669 3.019373   \nvn -0.682026 -0.315616 -0.659718\nv -0.610389 2.095161 -1.923515   \nvn 0.079253 0.114679 -0.990236\nv -3.040086 6.196918 -0.429149   \nvn -0.632897 0.017725 0.774033\nv -3.802695 3.768247 2.545523   \nvn -0.613666 -0.252877 0.747976\nv -0.159541 2.043362 3.328549   \nvn -0.569371 0.126387 0.812307\nv -3.744329 4.317850 2.491889   \nvn -0.861332 -0.437483 -0.258296\nv -3.047939 0.214155 1.873639   \nvn -0.672342 0.113482 0.731491\nv -4.416850 6.113058 3.166774   \nvn -0.284378 0.296197 -0.911810\nv -1.165133 0.460692 -1.742134   \nvn -0.107108 0.226257 -0.968161\nv -1.371289 4.249996 -1.317935   \nvn -0.849904 0.482269 0.212320\nv -3.447883 0.352100 0.466205   \nvn -0.726692 0.316961 0.609471\nv -4.495555 6.465548 2.944147   \nvn -0.911724 -0.400625 0.090878\nv -3.455335 0.171653 0.390816   \nvn -0.676347 0.086180 0.731525\nv -3.964028 4.017196 2.376009   \nvn -0.202801 -0.355190 -0.912530\nv -1.323595 1.763126 -0.750772   \nvn -0.546390 -0.107469 -0.830607\nv -3.971142 5.277524 -0.194960   \nvn -0.793141 -0.319462 0.518528\nv -3.222052 0.237723 0.872229   \nvn -0.856775 -0.003659 0.515677\nv -4.403784 3.891070 1.872077   \nvn -0.831890 0.127318 0.540138\nv -3.333311 0.342997 0.661016   \nvn -0.919982 0.125137 0.371449\nv -4.495871 4.296060 1.636080   \nvn -0.580013 -0.478228 0.659457\nv -3.636081 2.760711 2.361949   \nvn -0.899021 -0.187565 0.395701\nv -4.487235 3.559608 1.667370   \nvn -0.917927 0.317992 0.237256\nv -4.719787 7.268880 1.658722   \nvn -0.619680 0.403393 -0.673254\nv -1.086143 9.035741 -0.707144   \nvn -0.625665 -0.273373 -0.730623\nv -2.339693 1.600485 -0.404817   \nvn -0.908454 0.304914 0.285900\nv -4.642011 7.123829 1.990987   \nvn -0.188020 0.099380 -0.977124\nv -1.498077 3.854035 -1.369787   \nvn -0.783566 -0.294722 0.546958\nv -4.188372 4.729363 2.029830   \nvn -0.008527 0.121162 -0.992596\nv -3.116344 5.882284 -0.468884   \nvn -0.804063 0.106300 0.584964\nv -4.305236 4.246417 1.976991   \nvn -0.652202 -0.456084 0.605492\nv -3.022509 0.228190 1.065688   \nvn -0.697894 0.549023 0.459911\nv -2.799916 0.520220 1.128319   \nvn -0.814838 -0.145071 0.561242\nv -4.262823 3.534409 2.020383   \nvn -0.756930 0.016722 0.653282\nv -4.221533 3.947676 2.117350   \nvn -0.568539 0.279921 -0.773568\nv -3.744353 4.391712 -0.619300   \nvn -0.211586 -0.531108 -0.820460\nv -1.272905 0.156694 -1.741753   \nvn -0.567985 -0.501953 -0.652255\nv -3.624910 2.669825 -0.549664   \nvn -0.795041 -0.338811 0.503107\nv -4.180756 3.096179 1.987215   \nvn -0.696842 0.111982 0.708429\nv -4.059276 4.305313 2.232924   \nvn -0.765412 -0.642426 0.037856\nv -2.812753 0.183226 1.370267   \nvn -0.734941 -0.122795 0.666920\nv -4.032437 3.512234 2.309985   \nvn 0.024017 -0.999167 -0.032992\nv -0.037870 0.281880 0.530391   \nvn -0.773793 -0.219169 0.594314\nv -4.711562 5.468653 2.822838   \nvn -0.785745 0.439453 0.435299\nv -4.500636 6.953314 2.564445   \nvn -0.717607 0.565718 0.406207\nv -4.479433 7.216991 2.270682   \nvn 0.470952 -0.879806 -0.064383\nv 3.990562 0.505220 0.716309   \nvn 0.599075 0.094268 -0.795124\nv -2.512229 6.863447 -0.100658   \nvn 0.476430 -0.139466 -0.868081\nv -2.968058 6.956639 -0.370610   \nvn 0.499038 0.110223 -0.859542\nv 2.550375 3.142683 -1.540680   \nvn -0.105146 -0.054685 -0.992952\nv -2.320059 3.521605 -1.279397   \nvn -0.828543 0.355076 0.432940\nv -4.556319 6.646620 2.745363   \nvn -0.533503 0.634459 0.559318\nv -4.281091 7.108116 2.667598   \nvn -0.527584 0.812335 0.248529\nv -2.050095 8.411689 0.121353   \nvn -0.789614 0.315707 0.526154\nv -2.448540 1.135487 0.851875   \nvn 0.354769 -0.502745 -0.788281\nv 3.121815 0.699943 -0.277167   \nvn -0.842470 0.147899 0.518045\nv -4.698770 6.003760 2.843035   \nvn -0.584371 0.435372 -0.684807\nv -1.360599 8.824742 -0.595597   \nvn -0.160480 -0.968921 -0.188249\nv 1.128437 0.171611 0.301691   \nvn -0.628463 0.194687 -0.753081\nv -4.360146 6.289423 0.042233   \nvn 0.236406 0.686034 -0.688092\nv 1.400795 4.088829 -1.620409   \nvn -0.548896 -0.291905 -0.783265\nv -3.193462 8.460137 -3.559446   \nvn -0.651505 -0.083026 -0.754087\nv -3.168771 8.878431 -3.635795   \nvn -0.613543 0.419230 -0.669187\nv -3.434275 9.304302 -3.460878   \nvn -0.808417 -0.160765 -0.566229\nv -3.349993 8.808093 -3.381790   \nvn -0.848174 -0.230282 -0.477043\nv -3.304823 8.323865 -3.325905   \nvn -0.715714 0.649849 -0.255832\nv -3.572607 9.308843 -3.207672   \nvn 0.005091 -0.637322 -0.770581\nv -3.166393 8.201215 -3.430140   \nvn -0.770114 -0.210526 -0.602165\nv -3.451638 9.053310 -3.351345   \nvn -0.876943 -0.135034 -0.461234\nv -3.309591 8.549758 -3.375055   \nvn -0.814560 -0.294392 -0.499826\nv -3.527992 8.793926 -3.100376   \nvn -0.744376 -0.302178 -0.595477\nv -3.628700 8.981677 -3.076319   \nvn -0.911968 -0.242411 -0.330986\nv -3.445505 8.001887 -2.827300   \nvn -0.903507 -0.208276 -0.374560\nv -3.408011 8.221014 -3.039237   \nvn -0.794954 -0.424377 -0.433534\nv -3.659280 8.740382 -2.808856   \nvn -0.988483 0.120098 -0.092080\nv -3.878019 8.797295 -2.462866   \nvn -0.917719 -0.235541 -0.319863\nv -3.515132 8.232341 -2.747739   \nvn -0.880617 -0.231359 -0.413505\nv -3.460331 8.515240 -3.068180   \nvn -0.419084 -0.748269 -0.514258\nv -3.403703 7.658628 -2.648789   \nvn -0.931267 -0.216882 -0.292751\nv -3.507113 8.001590 -2.582275   \nvn -0.916964 -0.270665 -0.293117\nv -3.607373 8.174737 -2.401723   \nvn -0.856937 -0.416578 -0.303517\nv -3.749043 8.378084 -2.226959   \nvn -0.848997 -0.360393 -0.386420\nv -3.648514 8.502213 -2.613800   \nvn -0.583698 0.777172 -0.235161\nv -2.534199 0.904753 2.021148   \nvn 0.043596 0.770908 -0.635453\nv 1.408300 5.744252 -0.571402   \nvn -0.849041 -0.432208 -0.303850\nv -3.852536 8.571009 -2.352358   \nvn 0.586387 0.672920 -0.450920\nv 2.868255 5.373126 -0.163705   \nvn 0.275421 0.447885 -0.850613\nv 2.224363 4.669891 -1.061586   \nvn -0.929334 -0.322370 0.180046\nv -4.528281 4.885838 1.340274   \nvn 0.088662 0.343106 -0.935103\nv 1.308170 4.609629 -1.287620   \nvn -0.939708 -0.306564 0.151550\nv -4.519698 3.422501 1.354826   \nvn -0.901182 -0.326146 -0.285482\nv -3.549955 7.783228 -2.332859   \nvn -0.001220 0.918285 -0.395918\nv 1.123130 6.120856 0.045115   \nvn -0.686591 -0.661616 -0.301425\nv -3.620324 7.577160 -2.033423   \nvn -0.763376 -0.218067 -0.608034\nv -0.798833 2.624133 -1.992682   \nvn -0.973006 -0.098230 -0.208831\nv -3.617587 7.783148 -2.051383   \nvn -0.915698 -0.315960 -0.248327\nv -3.669293 8.103776 -2.102270   \nvn -0.999166 0.032288 -0.025008\nv -3.892417 8.667436 -2.167288   \nvn 0.056048 -0.998344 -0.012923\nv -0.537435 0.285345 -0.176267   \nvn -0.730110 0.219269 -0.647194\nv -0.841522 3.299866 -1.887861   \nvn -0.651125 0.446588 -0.613674\nv -0.761547 3.647082 -1.798953   \nvn -0.966102 -0.146531 -0.212544\nv -3.661544 7.857080 -1.867924   \nvn -0.884445 0.383844 0.265368\nv -3.886763 8.551783 -1.889171   \nvn -0.708759 -0.240309 -0.663258\nv -0.591244 1.549749 -1.714784   \nvn -0.805566 -0.269340 -0.527749\nv -0.775276 1.908218 -1.597609   \nvn -0.851871 -0.210693 -0.479504\nv -0.961458 2.573273 -1.695549   \nvn -0.928591 0.050160 0.367699\nv -2.215672 1.335009 2.143031   \nvn -0.985065 0.101519 0.139072\nv -4.622674 4.130242 1.220683   \nvn -0.191955 -0.964574 0.180972\nv 1.073440 0.290099 1.584734   \nvn -0.831906 -0.018473 -0.554609\nv -0.976906 2.921710 -1.766670   \nvn -0.726902 0.017051 -0.686530\nv -1.136960 3.194401 -1.513455   \nvn -0.920540 -0.329791 -0.209388\nv -3.743262 7.999490 -1.629286   \nvn -0.314802 0.370801 -0.873731\nv -2.876359 4.900986 -0.879556   \nvn 0.065579 0.639101 -0.766322\nv 0.550835 3.905557 -2.031372   \nvn 0.061339 0.468291 -0.881442\nv 0.777647 4.992314 -1.215703   \nvn 0.164716 0.548476 -0.819782\nv 1.445881 4.266201 -1.414663   \nvn -0.007396 0.708003 -0.706170\nv 1.274222 5.510543 -0.824495   \nvn -0.797970 -0.316479 -0.512918\nv -0.864685 2.318581 -1.702389   \nvn -0.493867 0.639468 -0.589216\nv -0.627458 3.820722 -1.743153   \nvn -0.940757 -0.295579 -0.166162\nv -3.867699 8.308660 -1.850066   \nvn 0.175911 0.633898 -0.753146\nv 1.635287 5.455870 -0.838440   \nvn -0.865238 -0.300884 -0.401039\nv -1.037876 2.538589 -1.513504   \nvn -0.914763 -0.240199 0.324828\nv -4.389930 4.739260 1.699639   \nvn -0.041105 0.461937 -0.885960\nv 0.048709 4.765232 -1.279506   \nvn -0.716828 -0.143312 -0.682363\nv -0.626548 1.339887 -1.595114   \nvn -0.905251 -0.387675 -0.173866\nv -3.682827 7.643453 -1.723398   \nvn -0.987868 -0.147723 0.047894\nv -3.868783 8.180191 -1.511743   \nvn -0.875789 -0.115572 -0.468654\nv -0.769880 1.508373 -1.419599   \nvn -0.751258 -0.186592 -0.633084\nv -1.138374 2.766765 -1.448163   \nvn 0.154666 0.780869 -0.605245\nv 1.699883 5.780752 -0.475361   \nvn -0.151271 -0.983012 0.103942\nv 1.214305 0.308517 1.866405   \nvn -0.886598 0.113769 -0.448331\nv -1.713642 0.373461 -1.265204   \nvn -0.670184 0.554029 -0.493869\nv -1.582388 0.582940 -1.267977   \nvn -0.868219 -0.247055 -0.430303\nv -0.879549 1.821581 -1.313787   \nvn -0.128303 0.834415 -0.535995\nv 0.519057 5.858757 -0.381397   \nvn -0.589573 -0.726185 -0.353637\nv -3.770989 2.449208 -0.132655   \nvn 0.137093 -0.644314 -0.752373\nv 0.087576 0.156713 -1.536160   \nvn -0.858845 -0.293334 -0.419929\nv -0.942622 2.146534 -1.421494   \nvn -0.581898 0.655803 -0.480955\nv -1.026192 1.022164 -1.145423   \nvn -0.873541 -0.204105 -0.441890\nv -0.964079 1.645473 -1.067631   \nvn -0.724807 -0.358544 -0.588304\nv -1.109128 2.458789 -1.291060   \nvn 0.034229 -0.212863 -0.976482\nv -1.037478 0.209489 -1.805424   \nvn -0.900447 -0.421541 -0.107232\nv -3.724391 7.599686 -1.273458   \nvn -0.998872 -0.044288 -0.017121\nv -3.787898 7.951792 -1.304794   \nvn 0.788309 0.042991 -0.613776\nv 3.821677 2.165581 -0.181535   \nvn -0.379132 0.169046 -0.909771\nv -2.394670 0.304606 -0.570375   \nvn -0.707727 0.702430 0.075594\nv -2.352928 1.043900 2.079369   \nvn 0.037475 0.961252 0.273112\nv -0.288899 9.640684 -1.006079   \nvn -0.334383 -0.900286 -0.278701\nv -3.472118 7.263001 -1.080326   \nvn -0.521814 0.723152 -0.452505\nv -1.240769 0.972352 -0.976446   \nvn -0.832250 0.181066 -0.523999\nv -1.845253 0.356801 -0.995574   \nvn -0.558334 0.156413 -0.814738\nv -2.322790 7.915361 -0.057477   \nvn -0.757110 -0.366744 -0.540633\nv -1.080920 2.179315 -1.168821   \nvn 0.509546 0.521515 -0.684386\nv 4.598833 2.156768 0.280264   \nvn -0.973497 0.199073 0.112579\nv -4.725417 6.442373 2.056809   \nvn -0.643627 0.664330 -0.380015\nv -0.490347 9.464290 -0.981092   \nvn -0.549953 -0.609586 -0.570926\nv -1.996520 0.097370 -0.765828   \nvn -0.602519 -0.383962 -0.699674\nv -1.137793 1.888846 -0.894165   \nvn -0.104768 0.457605 -0.882962\nv -0.372470 4.296610 -1.465199   \nvn -0.114005 0.836316 -0.536263\nv -0.184631 5.692946 -0.421398   \nvn -0.960282 -0.234659 -0.150976\nv -3.751694 7.742231 -1.086908   \nvn -0.799695 0.169362 -0.576024\nv -1.001416 1.298225 -0.904674   \nvn -0.531429 -0.787980 -0.310917\nv -3.536884 7.190777 -0.788609   \nvn -0.871461 -0.441556 -0.213504\nv -3.737597 7.511281 -0.940052   \nvn -0.627180 0.421762 -0.654799\nv -1.766651 0.669388 -0.873054   \nvn 0.561903 0.121470 -0.818236\nv 3.112245 3.474345 -1.129672   \nvn -0.238257 0.681382 -0.692064\nv -0.175504 3.812980 -2.047900   \nvn -0.864437 -0.420341 -0.275793\nv -3.766762 7.412514 -0.681569   \nvn -0.656576 0.729522 -0.191587\nv -0.633750 9.439424 -0.785128   \nvn -0.117300 0.489756 -0.863933\nv -0.518199 4.768982 -1.258625   \nvn 0.059767 0.730575 -0.680211\nv 0.790619 4.212759 -1.610218   \nvn -0.598199 0.047195 -0.799956\nv -3.761951 3.742528 -0.756283   \nvn -0.046173 0.740997 -0.669919\nv 0.897483 5.679808 -0.612423   \nvn 0.199613 0.467062 -0.861399\nv 2.221126 4.427468 -1.252155   \nvn 0.040759 0.965522 -0.257112\nv -0.728577 5.846457 0.062702   \nvn 0.512043 0.769197 -0.382293\nv 0.194451 9.503908 -1.482461   \nvn -0.586479 0.131223 -0.799264\nv -0.099243 9.385459 -1.395640   \nvn 0.133516 0.446984 -0.884522\nv 0.643185 3.636855 -2.180247   \nvn -0.051319 0.856390 -0.513772\nv 0.894522 5.900601 -0.356935   \nvn 0.364965 0.479998 -0.797749\nv 2.595516 4.757310 -0.893245   \nvn 0.232281 0.634647 -0.737068\nv 1.108497 3.936893 -1.905098   \nvn 0.277659 0.799980 -0.531919\nv 1.989894 5.789726 -0.343268   \nvn -0.999083 0.024317 -0.035240\nv -3.802345 7.655508 -0.613817   \nvn 0.366560 0.447677 -0.815610\nv 2.339353 4.962570 -0.903080   \nvn -0.140520 0.795186 -0.589859\nv 0.125640 4.013324 -1.879236   \nvn -0.750573 -0.037415 -0.659727\nv -4.078965 3.683254 -0.445439   \nvn 0.330812 0.540256 -0.773749\nv 2.092899 5.256128 -0.831607   \nvn -0.014004 -0.999144 0.038919\nv 0.427571 0.291769 1.272964   \nvn 0.448636 0.247622 -0.858726\nv 2.335549 3.480056 -1.581949   \nvn 0.112054 -0.422916 -0.899214\nv -0.156870 0.324827 -1.648922   \nvn -0.057418 0.921808 -0.383371\nv -0.536522 5.760786 -0.203535   \nvn -0.140586 -0.978339 0.151946\nv 1.507082 0.078251 -0.923109   \nvn -0.035360 -0.813522 0.580458\nv -1.854742 0.134826 2.698774   \nvn -0.715133 -0.298433 -0.632078\nv -3.939827 3.168498 -0.526144   \nvn -0.753712 -0.101452 -0.649327\nv -3.984610 3.398690 -0.533212   \nvn -0.691918 0.230805 -0.684090\nv -3.961738 4.217132 -0.489147   \nvn 0.344843 0.535799 -0.770716\nv 4.273789 2.181164 0.153786   \nvn -0.057944 0.856766 -0.512440\nv -0.470498 5.645664 -0.439079   \nvn -0.065018 0.769529 -0.635293\nv -0.414539 5.488017 -0.673379   \nvn -0.024585 0.569627 -0.821536\nv -0.097462 5.062739 -1.114863   \nvn 0.005312 0.836297 -0.548251\nv 1.198092 5.882232 -0.391699   \nvn 0.548997 0.561989 -0.618684\nv 2.855834 5.085022 -0.498678   \nvn 0.143215 0.751356 -0.644169\nv 1.037998 4.129757 -1.701811   \nvn 0.187072 0.458364 -0.868853\nv 1.728091 5.068444 -1.063761   \nvn -0.622083 -0.566451 -0.540505\nv -3.832258 2.625141 -0.311384   \nvn -0.790110 -0.300767 -0.534103\nv -4.078526 3.070256 -0.284362   \nvn -0.732942 0.098471 -0.673127\nv -4.080365 3.954243 -0.440471   \nvn -0.083998 0.672418 -0.735390\nv -0.152578 5.276267 -0.929815   \nvn -0.592094 0.802027 -0.078596\nv -1.489635 8.928082 -0.295891   \nvn -0.070130 0.619741 -0.781666\nv 0.759294 5.155850 -1.087374   \nvn -0.794989 -0.390335 -0.464361\nv -4.000338 2.801647 -0.235135   \nvn -0.845227 0.046287 -0.532400\nv -4.290801 3.823209 -0.193740   \nvn -0.811883 0.172334 -0.557806\nv -4.221493 4.256180 -0.189894   \nvn -0.707905 0.257740 -0.657602\nv -4.066195 4.719160 -0.201724   \nvn -0.202483 0.720230 -0.663528\nv -0.155386 4.076396 -1.662865   \nvn 0.557947 0.381289 -0.737098\nv 3.054571 4.414305 -0.825985   \nvn -0.653342 0.508489 -0.560877\nv -1.652919 8.726499 -0.388504   \nvn -0.496513 0.629992 -0.597147\nv -3.042753 0.560068 -0.126425   \nvn -0.734430 0.094840 -0.672025\nv -2.434456 1.118088 -0.213563   \nvn -0.553246 -0.568740 -0.608650\nv -2.623502 1.845062 -0.283697   \nvn -0.838084 -0.185266 -0.513120\nv -4.233371 3.439410 -0.202918   \nvn 0.443423 0.293743 -0.846812\nv 2.726702 3.820710 -1.280097   \nvn -0.120623 0.771227 -0.625027\nv 0.184199 4.146390 -1.673653   \nvn -0.531408 0.623209 -0.573773\nv -1.289203 0.624562 -1.560929   \nvn -0.940987 -0.127015 -0.313704\nv -3.823676 7.382458 -0.407223   \nvn -0.085256 0.548650 -0.831694\nv 0.476667 5.064419 -1.143742   \nvn -0.630396 0.202611 -0.749367\nv -3.873651 4.955112 -0.269389   \nvn 0.074584 0.496779 -0.864667\nv 1.349666 5.312227 -1.000274   \nvn -0.885964 0.378625 -0.267788\nv -2.043776 8.434488 -0.108891   \nvn -0.512167 0.612234 -0.602374\nv -2.763964 0.733395 -0.129294   \nvn -0.897543 -0.042384 -0.438886\nv -4.380505 3.664409 -0.024546   \nvn -0.035531 0.660667 -0.749838\nv -0.712110 5.341811 -0.803281   \nvn -0.819309 0.073081 -0.568675\nv -3.960858 7.183112 -0.118407   \nvn -0.936698 0.343393 -0.068401\nv -3.822277 7.712853 -0.263221   \nvn -0.678646 0.632764 -0.372893\nv -2.346808 8.108588 0.063244   \nvn -0.594740 0.762532 0.254618\nv -1.841731 8.642999 -0.142496   \nvn -0.700940 0.396864 -0.592607\nv -2.600055 0.985604 -0.043595   \nvn -0.582491 -0.709244 -0.397087\nv -3.513057 2.213243 -0.044151   \nvn -0.756057 -0.591288 -0.280635\nv -3.963492 2.603055 -0.080898   \nvn -0.871702 -0.298116 -0.388924\nv -4.258066 3.145370 -0.027046   \nvn -0.768804 -0.065322 -0.636139\nv -4.261572 5.003340 0.130040   \nvn 0.103327 0.690489 -0.715925\nv 0.795464 3.998730 -1.905688   \nvn -0.746764 0.450494 -0.489284\nv -3.300873 0.384761 0.013271   \nvn -0.744736 0.546161 -0.383504\nv -2.770244 0.881942 0.077313   \nvn -0.548678 -0.801157 -0.238956\nv -3.456227 1.993871 0.301054   \nvn -0.929694 0.070247 -0.361571\nv -4.441987 3.914144 0.177867   \nvn -0.735960 0.312631 -0.600520\nv -4.367075 6.611414 0.165312   \nvn -0.644843 0.712533 -0.276541\nv -3.201767 0.576292 0.105769   \nvn -0.657673 0.730733 0.183016\nv -3.174354 0.645009 0.440373   \nvn -0.565133 0.778749 -0.272351\nv -2.996576 0.742620 0.161325   \nvn -0.757681 -0.587282 -0.284639\nv -2.724979 1.656497 0.092983   \nvn -0.483514 -0.758162 -0.437498\nv -3.261757 2.017742 -0.070763   \nvn -0.843001 0.186618 -0.504503\nv -4.280173 4.518235 -0.002999   \nvn -0.704964 0.085347 -0.704090\nv -4.471073 5.945358 0.052020   \nvn -0.737269 -0.644383 -0.202988\nv -3.877137 2.407430 0.274928   \nvn -0.903500 0.118716 -0.411818\nv -4.371219 4.252758 0.078039   \nvn -0.848509 0.497781 -0.179575\nv -3.400914 0.409830 0.238599   \nvn -0.935860 -0.166757 -0.310416\nv -4.442930 3.523242 0.146339   \nvn -0.776485 -0.329290 -0.537251\nv -4.574528 5.279761 0.353923   \nvn -0.783225 0.315619 -0.535671\nv -4.226643 7.191282 0.269256   \nvn -0.822693 -0.502769 -0.265327\nv -4.163610 2.843204 0.097727   \nvn -0.877043 -0.298411 -0.376493\nv -4.528506 5.011661 0.536625   \nvn -0.117253 0.785211 -0.608026\nv 0.355140 5.664802 -0.572814   \nvn 0.478113 0.710590 -0.516207\nv 2.508711 5.580976 -0.266636   \nvn 0.421761 0.279903 -0.862422\nv 2.556226 3.633779 -1.426362   \nvn 0.173901 0.392195 -0.903295\nv 1.878456 4.533714 -1.223744   \nvn 0.344258 0.424018 -0.837672\nv 2.460709 4.440241 -1.139500   \nvn 0.392752 0.639221 -0.661168\nv 2.218589 5.514603 -0.560066   \nvn 0.392845 0.771490 -0.500475\nv 2.263712 5.737023 -0.250694   \nvn 0.530069 0.279041 -0.800726\nv 2.964981 3.814858 -1.139927   \nvn -0.008769 0.607414 -0.794337\nv 0.991384 5.304131 -0.999867   \nvn 0.436329 0.446561 -0.781153\nv 2.811870 4.547292 -0.916025   \nvn 0.498973 0.500910 -0.707188\nv 2.918089 4.768382 -0.702808   \nvn 0.660989 0.372240 -0.651560\nv 3.262403 4.414286 -0.657935   \nvn -0.136508 0.931852 -0.336182\nv 0.652136 6.089113 0.069089   \nvn 0.688019 0.193291 -0.699477\nv 3.361389 3.505200 -0.946123   \nvn 0.427296 0.527852 -0.734024\nv 2.613042 5.037192 -0.697153   \nvn -0.064162 0.504116 -0.861250\nv 0.094339 4.368580 -1.451238   \nvn 0.664160 0.272467 -0.696171\nv 3.290862 4.155716 -0.732318   \nvn 0.392928 0.357852 -0.847083\nv 2.658063 4.073614 -1.217455   \nvn 0.622525 0.302309 -0.721853\nv 3.260349 3.753257 -0.946819   \nvn 0.095858 0.393430 -0.914344\nv 1.124268 4.862463 -1.207855   \nvn 0.778996 0.524247 -0.343993\nv 3.351580 4.899247 -0.027586   \nvn 0.664386 0.499231 -0.556201\nv 3.194057 4.691257 -0.524566   \nvn 0.671983 0.572072 -0.470289\nv 3.090119 5.116085 -0.232550   \nvn 0.336066 0.359171 -0.870664\nv 2.418965 3.811753 -1.419399   \nvn 0.384142 0.381722 -0.840668\nv 2.191789 3.877038 -1.470230   \nvn 0.419092 0.370810 -0.828772\nv 4.043166 2.034188 0.015477   \nvn -0.452099 0.714312 -0.534196\nv -1.026966 0.867660 -1.410912   \nvn 0.381020 0.495354 -0.780672\nv 1.937563 3.860005 -1.617465   \nvn 0.558636 0.323280 -0.763817\nv 2.989040 4.101806 -0.998132   \nvn -0.169194 0.913452 -0.370107\nv -0.142611 5.865305 -0.100872   \nvn 0.667226 0.300984 -0.681336\nv 3.972673 2.292069 0.089463   \nvn 0.652973 0.317080 -0.687812\nv 3.233490 3.959925 -0.849829   \nvn -0.165002 0.867317 -0.469612\nv 0.163040 5.857276 -0.216704   \nvn 0.206515 0.420526 -0.883465\nv 4.122964 1.770061 -0.114906   \nvn 0.304605 0.410891 -0.859293\nv 2.099057 4.978374 -0.984490   \nvn 0.769203 0.251681 -0.587353\nv 3.502411 3.761810 -0.667502   \nvn 0.318099 0.837997 -0.443368\nv 2.079484 5.939614 -0.036205   \nvn -0.158993 0.445179 -0.881213\nv -0.084568 3.525193 -2.253506   \nvn -0.017025 0.798638 -0.601571\nv 0.423859 4.060950 -1.845327   \nvn 0.113142 0.881622 -0.458194\nv 1.601300 6.006466 -0.153429   \nvn -0.032509 0.594480 -0.803453\nv 0.271701 3.844964 -2.078748   \nvn -0.051205 0.607858 -0.792393\nv 0.273577 5.218904 -0.994711   \nvn -0.335588 0.730678 -0.594550\nv -0.410578 3.921650 -1.773635   \nvn 0.264884 0.681308 -0.682390\nv 1.941954 5.600410 -0.621569   \nvn -0.095097 0.730650 -0.676097\nv 0.100825 5.462131 -0.774256   \nvn -0.471459 0.496465 -0.728868\nv -0.530160 3.619892 -2.027451   \nvn 0.021440 0.767388 -0.640824\nv -0.822371 5.517453 -0.605747   \nvn -0.287335 0.214206 -0.933571\nv -2.474925 7.670892 -0.020174   \nvn 0.517213 -0.600068 -0.610254\nv 4.015710 0.830194 -0.013793   \nvn -0.115796 0.606707 -0.786446\nv -0.400092 5.094112 -1.041992   \nvn -0.146314 0.357390 -0.922423\nv -2.887284 5.581246 -0.525324   \nvn 0.255819 0.931095 -0.260036\nv -1.559841 6.050972 0.079301   \nvn -0.515826 0.286283 -0.807444\nv -0.469317 3.291673 -2.235211   \nvn 0.055541 0.346492 -0.936407\nv 0.337397 3.467926 -2.295458   \nvn -0.151008 0.518116 -0.841875\nv -2.632074 5.573701 -0.582717   \nvn -0.208013 0.954818 -0.212257\nv -0.030318 6.011395 0.276616   \nvn 0.003282 0.196650 -0.980468\nv -0.934373 0.388987 -1.780523   \nvn 0.072487 0.352123 -0.933143\nv -2.661263 5.844838 -0.425966   \nvn -0.063033 0.693608 -0.717590\nv 0.549353 5.489646 -0.807268   \nvn 0.443741 0.558913 -0.700507\nv -2.194355 6.197491 -0.109322   \nvn -0.098286 0.595855 -0.797055\nv -2.289618 5.664813 -0.581098   \nvn 0.313233 0.539229 -0.781740\nv 1.583583 3.796366 -1.844498   \nvn 0.077759 -0.786376 -0.612835\nv 0.855295 0.215979 -1.425557   \nvn -0.226094 0.491758 -0.840866\nv -2.627569 5.300236 -0.767174   \nvn 0.351711 0.754270 -0.554415\nv 4.333347 2.384332 0.399129   \nvn -0.023157 0.618864 -0.785157\nv -1.880401 5.583843 -0.696561   \nvn -0.114209 0.533406 -0.838113\nv -2.172346 5.324859 -0.846246   \nvn 0.047414 0.619692 -0.783412\nv -2.270580 5.906265 -0.388373   \nvn 0.091509 0.761935 -0.641156\nv -1.960049 5.889346 -0.397593   \nvn 0.212799 0.428276 -0.878235\nv 0.965756 3.675470 -2.105671   \nvn 0.711818 0.551053 -0.435495\nv -2.014066 6.431125 0.287254   \nvn 0.008923 0.493364 -0.869777\nv -1.776173 5.287097 -0.890910   \nvn -0.036238 0.429825 -0.902185\nv -2.025852 5.089562 -0.980218   \nvn 0.362998 0.805846 -0.467809\nv -1.886418 6.108358 -0.000667   \nvn 0.113845 0.772004 -0.625339\nv -1.600803 5.785347 -0.491069   \nvn -0.021359 0.436815 -0.899298\nv -1.661880 4.968053 -1.042535   \nvn 0.174852 0.885240 -0.431019\nv -1.600621 5.962818 -0.188044   \nvn 0.139823 0.634530 -0.760146\nv -1.588831 5.615418 -0.665456   \nvn 0.511641 0.307513 -0.802283\nv 4.469010 1.880138 0.057248   \nvn -0.501154 0.294853 -0.813576\nv -1.978845 0.927399 -0.554856   \nvn 0.056095 0.567152 -0.821701\nv -1.408074 5.325266 -0.839670   \nvn 0.273427 0.343271 -0.898556\nv 1.923123 4.843955 -1.101389   \nvn -0.406914 -0.176650 -0.896223\nv -2.873780 0.117106 -0.412735   \nvn 0.174775 0.745216 -0.643511\nv -1.222193 5.626380 -0.539981   \nvn -0.295128 -0.398651 -0.868318\nv -2.632537 0.166349 -0.489218   \nvn 0.250641 0.842608 -0.476646\nv -1.370865 5.838832 -0.341026   \nvn 0.038880 0.697020 -0.715997\nv -1.067742 5.448874 -0.692701   \nvn 0.016596 0.604150 -0.796698\nv -1.073798 5.220878 -0.908779   \nvn -0.038039 0.467710 -0.883063\nv -1.147562 4.950417 -1.079727   \nvn -0.291313 0.278266 -0.915262\nv -2.789115 4.531047 -1.042713   \nvn -0.451603 0.200657 -0.869363\nv -3.550826 4.170487 -0.806058   \nvn -0.440173 0.323808 -0.837494\nv -3.331694 4.798177 -0.695680   \nvn -0.544461 0.323491 -0.773897\nv -3.689404 4.688543 -0.534317   \nvn -0.478588 0.216732 -0.850870\nv -3.511509 5.106246 -0.483632   \nvn -0.112704 -0.993615 -0.005170\nv 1.796344 0.076137 0.080455   \nvn -0.235101 0.166996 -0.957518\nv -3.306354 5.473605 -0.478764   \nvn -0.251496 -0.098052 -0.962879\nv -2.692503 3.346604 -1.209590   \nvn -0.242530 -0.742142 0.624823\nv -3.963056 5.187462 3.113156   \nvn -0.482000 0.118728 -0.868090\nv -3.901231 6.391477 -0.246984   \nvn 0.718170 -0.105124 -0.687881\nv 4.484234 1.518638 -0.001617   \nvn 0.429463 0.165534 -0.887784\nv 4.308829 1.657716 -0.119275   \nvn 0.545108 -0.260391 -0.796903\nv 4.290045 1.339528 -0.110626   \nvn -0.464427 0.003384 -0.885605\nv -3.514938 3.524974 -0.909109   \nvn -0.247826 -0.494489 -0.833104\nv -2.194300 2.121630 -0.719660   \nvn 0.483387 -0.364580 -0.795876\nv 4.108206 1.091087 -0.114160   \nvn 0.376546 -0.061895 -0.924328\nv 3.785312 1.392435 -0.285880   \nvn 0.262885 0.034733 -0.964202\nv 4.092886 1.480476 -0.210655   \nvn 0.234015 0.083646 -0.968628\nv -2.965937 6.469006 -0.379085   \nvn -0.600315 -0.354295 -0.717005\nv -3.708581 2.962974 -0.639790   \nvn -0.485017 -0.700930 -0.522930\nv -3.297971 2.218917 -0.299872   \nvn 0.371576 -0.556380 -0.743218\nv 3.806949 0.804703 -0.114380   \nvn 0.283036 -0.271677 -0.919827\nv 3.747957 1.059258 -0.273069   \nvn -0.370981 0.157396 -0.915205\nv -3.101827 4.111444 -1.006255   \nvn -0.044396 0.336498 -0.940637\nv -1.536445 4.658913 -1.195049   \nvn -0.503058 -0.683000 -0.529568\nv -3.549826 2.450555 -0.375694   \nvn -0.675346 -0.731296 -0.095466\nv -3.676495 2.108366 0.534323   \nvn -0.317983 0.044302 -0.947061\nv -3.674738 5.925075 -0.400011   \nvn -0.027713 -0.393080 -0.919086\nv -2.250115 2.848335 -1.121174   \nvn -0.336538 -0.055970 -0.940005\nv -3.698062 5.667567 -0.381396   \nvn 0.256153 -0.474695 -0.842051\nv 3.468966 0.734643 -0.190624   \nvn -0.433406 -0.099705 -0.895666\nv -3.979720 5.670078 -0.268740   \nvn -0.348542 0.179830 -0.919880\nv -3.002087 4.337837 -1.033421   \nvn -0.494885 -0.539784 -0.680972\nv -3.356392 2.608308 -0.713323   \nvn -0.038914 -0.189935 -0.981025\nv -1.833016 3.359983 -1.287750   \nvn -0.073958 -0.030141 -0.996806\nv -1.989069 3.632416 -1.305607   \nvn 0.382066 -0.712160 -0.588943\nv 3.591254 0.542371 0.026146   \nvn 0.340299 -0.338013 -0.877464\nv 3.364927 1.082572 -0.342613   \nvn -0.408846 0.119215 -0.904783\nv -3.393759 3.866801 -0.937266   \nvn -0.532928 -0.145025 -0.833640\nv -4.124865 5.549529 -0.161729   \nvn -0.622353 -0.100130 -0.776306\nv -4.423423 5.687223 0.000103   \nvn -0.406394 -0.350821 -0.843664\nv -1.496881 2.601785 -1.114328   \nvn 0.473880 0.205856 -0.856190\nv -2.642297 6.496932 -0.264175   \nvn -0.477939 -0.060184 -0.876329\nv -3.684236 6.819423 -0.320233   \nvn -0.083007 -0.244003 -0.966215\nv -2.286996 3.167067 -1.246651   \nvn -0.570825 0.104370 -0.814411\nv -1.624896 8.448480 -0.530014   \nvn -0.656428 -0.687687 -0.310142\nv -3.666787 2.159266 0.268149   \nvn -0.392556 -0.531206 -0.750813\nv -2.402625 2.011243 -0.564460   \nvn -0.245930 -0.645006 -0.723523\nv -2.736166 2.259839 -0.694300   \nvn -0.064788 0.033299 -0.997343\nv -2.168611 3.890780 -1.292206   \nvn -0.020622 -0.159842 -0.986927\nv -2.065956 3.345708 -1.281346   \nvn -0.219833 -0.476517 -0.851237\nv -2.778147 2.675605 -0.995706   \nvn -0.454450 0.308869 -0.835509\nv -3.507431 4.513272 -0.718290   \nvn -0.179278 0.226672 -0.957329\nv -2.301184 4.293911 -1.238182   \nvn 0.294826 -0.919863 -0.258707\nv 3.205808 0.211078 0.394349   \nvn -0.105700 0.344754 -0.932723\nv -2.129936 4.870577 -1.080781   \nvn -0.111488 -0.504617 -0.856115\nv -2.287977 2.496593 -0.934069   \nvn -0.169694 -0.296195 -0.939932\nv -2.701833 2.931814 -1.114509   \nvn 0.270644 -0.664002 -0.697032\nv 3.294795 0.506310 -0.081062   \nvn 0.222380 0.017587 -0.974801\nv -2.552829 7.468771 -0.021541   \nvn 0.549430 -0.510567 -0.661399\nv 3.067210 0.944066 -0.430740   \nvn -0.360990 -0.726215 -0.585062\nv -2.860860 1.973622 -0.303132   \nvn -0.400763 0.033565 -0.915567\nv -3.598818 5.419613 -0.401645   \nvn -0.514584 -0.588399 -0.623690\nv -1.524381 0.080156 -1.616620   \nvn -0.122996 -0.369763 -0.920949\nv -1.907291 2.646274 -1.039438   \nvn 0.322626 -0.718132 -0.616603\nv 2.950783 0.407562 -0.105407   \nvn -0.157511 -0.230599 -0.960216\nv -1.663048 1.655038 -0.689787   \nvn -0.327027 0.176478 -0.928391\nv -1.728102 1.110064 -0.635963   \nvn -0.202365 -0.358408 -0.911368\nv -2.085823 7.686296 -0.159745   \nvn 0.572786 0.071217 -0.816605\nv 2.883518 3.157009 -1.308580   \nvn -0.404105 0.403764 -0.820776\nv -2.724116 0.417169 -0.389719   \nvn -0.324225 -0.453281 -0.830310\nv -1.788636 7.862672 -0.346413   \nvn -0.504981 -0.056371 -0.861288\nv -2.186418 1.249609 -0.434583   \nvn -0.313814 -0.543869 -0.778285\nv -3.092434 2.606657 -0.860002   \nvn -0.110711 0.042379 -0.992949\nv -1.737314 3.874201 -1.330986   \nvn 0.560503 -0.707709 -0.430099\nv 2.564522 0.422967 -0.390903   \nvn 0.382689 0.267712 -0.884240\nv 1.670782 3.538432 -1.924753   \nvn -0.119597 0.093133 -0.988445\nv -2.338131 4.025780 -1.286673   \nvn -0.076339 0.091157 -0.992906\nv -1.916516 4.054121 -1.301788   \nvn 0.647889 -0.097590 -0.755458\nv 2.871590 2.034949 -1.267139   \nvn -0.021510 -0.321021 -0.946828\nv -1.931518 3.062883 -1.197227   \nvn -0.123475 -0.957901 0.259190\nv -0.816602 0.135682 3.104104   \nvn 0.178448 -0.644914 -0.743130\nv 0.469392 0.213916 -1.489608   \nvn 0.564764 -0.074862 -0.821850\nv 2.574055 1.950091 -1.514427   \nvn 0.572744 0.019574 -0.819500\nv 2.733595 2.682546 -1.461213   \nvn -0.083835 0.337699 -0.937513\nv -1.915407 4.693647 -1.151721   \nvn -0.150946 0.025528 -0.988212\nv -3.412883 5.867094 -0.450528   \nvn 0.216090 -0.961385 -0.170424\nv 2.288220 0.120432 -0.041020   \nvn 0.439382 -0.888035 -0.135417\nv 2.244477 0.144240 -0.376933   \nvn -0.182317 -0.127159 -0.974983\nv -1.676198 3.570698 -1.328031   \nvn -0.072860 0.224909 -0.971652\nv -1.821193 4.366982 -1.266271   \nvn -0.406074 -0.255192 -0.877485\nv -1.552208 8.099221 -0.532620   \nvn -0.185919 -0.402275 -0.896443\nv -1.727419 2.390970 -0.989456   \nvn -0.215705 0.294889 -0.930866\nv -2.468226 4.711663 -1.069766   \nvn 0.308215 0.355185 -0.882523\nv -2.451669 6.113319 -0.273788   \nvn 0.581083 -0.086629 -0.809221\nv 2.635447 2.295842 -1.518361   \nvn -0.636211 0.099506 -0.765071\nv -2.020809 8.150253 -0.246714   \nvn 0.567425 -0.459224 -0.683478\nv 2.292455 0.805596 -1.304200   \nvn 0.625451 -0.069576 -0.777155\nv 2.641556 1.656650 -1.466962   \nvn 0.487820 0.055599 -0.871172\nv 2.409062 2.842538 -1.635025   \nvn 0.481501 -0.182233 -0.857291\nv 2.456682 1.459484 -1.575430   \nvn -0.145498 -0.232504 -0.961651\nv -1.691047 3.173582 -1.247082   \nvn -0.231033 -0.371121 -0.899385\nv -1.865642 1.957608 -0.768683   \nvn -0.894976 -0.238239 -0.377175\nv -3.401579 0.204070 0.100932   \nvn 0.434004 -0.076216 -0.897681\nv 2.301981 1.710200 -1.650461   \nvn 0.473759 0.033190 -0.880029\nv 2.342929 2.611944 -1.690713   \nvn -0.182533 -0.304950 -0.934712\nv -1.676111 2.923894 -1.178350   \nvn -0.309784 0.013955 -0.950705\nv -2.992039 3.547631 -1.118945   \nvn -0.252293 0.082763 -0.964105\nv -3.571677 6.504634 -0.375455   \nvn 0.323735 -0.234467 -0.916636\nv 2.141764 1.460869 -1.702464   \nvn -0.395249 0.313841 -0.863297\nv -3.221958 5.146049 -0.615632   \nvn 0.448012 0.089691 -0.889517\nv 2.192380 2.949367 -1.747242   \nvn 0.467446 -0.053217 -0.882418\nv 2.320791 2.232971 -1.706842   \nvn 0.414989 0.016585 -0.909675\nv 2.088678 2.585235 -1.813159   \nvn -0.510742 0.287534 -0.810226\nv -2.196404 0.592218 -0.569709   \nvn -0.358547 -0.336525 -0.870744\nv -2.120811 1.836483 -0.623380   \nvn -0.192291 -0.417419 -0.888136\nv -1.949935 2.271249 -0.874128   \nvn 0.426042 -0.419052 -0.801801\nv 2.235901 1.110183 -1.510719   \nvn 0.444249 0.094521 -0.890903\nv 2.020157 3.241128 -1.803917   \nvn 0.366272 -0.137546 -0.920286\nv 2.054336 1.949394 -1.792332   \nvn -0.390718 0.360952 -0.846790\nv -3.094117 4.996595 -0.740238   \nvn 0.368927 -0.415344 -0.831494\nv 2.038063 0.635949 -1.402041   \nvn 0.314456 -0.141879 -0.938609\nv 1.980644 1.684408 -1.767780   \nvn 0.356730 0.081084 -0.930682\nv 1.587432 3.306542 -1.991131   \nvn 0.337516 -0.397823 -0.853124\nv 1.935322 0.976267 -1.602208   \nvn 0.279006 -0.295616 -0.913656\nv 1.922621 1.235522 -1.698813   \nvn 0.296324 -0.151726 -0.942959\nv 1.712495 1.911874 -1.903234   \nvn 0.353842 -0.066929 -0.932907\nv 1.912802 2.259273 -1.888698   \nvn 0.289933 -0.536807 -0.792324\nv 1.884367 0.355453 -1.312633   \nvn 0.181534 -0.430954 -0.883925\nv 1.676427 0.762830 -1.539455   \nvn 0.389716 0.050638 -0.919542\nv 1.784530 2.836620 -1.943035   \nvn 0.195099 -0.835740 -0.513298\nv 1.697312 0.120281 -1.150324   \nvn 0.316512 -0.111483 -0.942015\nv 1.648318 2.484973 -1.999505   \nvn -0.479915 0.079751 -0.873683\nv -4.051804 5.958472 -0.231731   \nvn -0.381967 -0.168027 -0.908773\nv -1.964823 1.464607 -0.581150   \nvn 0.272001 -0.112726 -0.955672\nv 1.559960 2.183486 -1.971378   \nvn 0.215433 -0.339734 -0.915516\nv 1.628125 1.045912 -1.707832   \nvn 0.250237 -0.228711 -0.940783\nv 1.701684 1.540428 -1.827156   \nvn 0.139048 0.346996 -0.927502\nv 1.567475 4.869481 -1.184665   \nvn 0.204793 -0.509537 -0.835722\nv 1.432492 0.843779 -1.648083   \nvn 0.324186 0.058037 -0.944211\nv 1.173837 2.978983 -2.156687   \nvn 0.300107 0.171527 -0.938357\nv 1.235287 3.379750 -2.095150   \nvn 0.227918 -0.274106 -0.934302\nv 1.252589 1.525293 -1.949205   \nvn 0.250764 -0.131312 -0.959101\nv 1.159334 2.336379 -2.105361   \nvn 0.320044 -0.032169 -0.946856\nv 1.490610 2.695263 -2.083216   \nvn -0.672750 0.187878 -0.715618\nv -4.122486 6.782604 -0.025450   \nvn 0.100697 -0.603025 -0.791341\nv 1.173388 0.279193 -1.423418   \nvn 0.167845 -0.473898 -0.864436\nv 1.505684 0.380815 -1.414395   \nvn 0.241854 -0.278537 -0.929475\nv 1.391423 1.343031 -1.843557   \nvn 0.223472 -0.082615 -0.971203\nv 1.263449 2.732250 -2.144961   \nvn 0.121532 -0.443481 -0.888006\nv 1.295858 0.597122 -1.515628   \nvn 0.268167 0.487662 -0.830826\nv 1.245851 3.729126 -1.993015   \nvn 0.287669 0.198673 -0.936897\nv -2.761439 6.237170 -0.365856   \nvn 0.173454 -0.256551 -0.950839\nv 0.978887 1.664888 -2.046633   \nvn 0.167484 -0.428879 -0.887701\nv 1.219542 0.982729 -1.785486   \nvn 0.258860 -0.159223 -0.952701\nv 1.315915 1.917480 -2.027880   \nvn -0.379644 -0.722802 -0.577431\nv -3.052746 2.127222 -0.369082   \nvn 0.160726 -0.298361 -0.940823\nv 0.977656 1.362230 -1.944119   \nvn 0.283176 0.214299 -0.934819\nv 0.936122 3.394470 -2.203007   \nvn -0.285603 0.180290 -0.941237\nv -2.740036 4.184702 -1.122849   \nvn 0.240405 -0.090965 -0.966401\nv 0.853581 2.864694 -2.260847   \nvn 0.100548 -0.507820 -0.855575\nv 0.719569 0.818762 -1.763618   \nvn 0.132024 -0.350852 -0.927077\nv 0.839115 1.159359 -1.907943   \nvn 0.180866 -0.179743 -0.966944\nv 0.932069 1.945590 -2.117962   \nvn 0.146076 0.210768 -0.966560\nv 0.579321 3.326747 -2.299369   \nvn 0.134912 -0.454603 -0.880417\nv 0.863240 0.597822 -1.565106   \nvn 0.075115 -0.373964 -0.924396\nv 0.574567 1.158452 -1.943123   \nvn 0.182850 -0.181241 -0.966291\nv 0.525138 2.137252 -2.213867   \nvn 0.215344 -0.142790 -0.966042\nv 0.779941 2.342019 -2.206157   \nvn 0.223935 -0.101751 -0.969278\nv 0.915255 2.618102 -2.209041   \nvn 0.160376 -0.019104 -0.986871\nv 0.526426 3.022410 -2.321826   \nvn 0.187668 -0.103226 -0.976793\nv 0.495431 2.521396 -2.295905   \nvn 0.252014 0.057185 -0.966032\nv 0.807990 3.156817 -2.286432   \nvn -0.109925 -0.363891 -0.924932\nv 0.273556 1.304936 -2.012509   \nvn 0.119852 -0.283416 -0.951478\nv 0.664326 1.530024 -2.048722   \nvn 0.148084 -0.168157 -0.974574\nv 0.219173 2.329070 -2.323212   \nvn 0.087963 -0.435220 -0.896017\nv 0.405324 0.695359 -1.704884   \nvn -0.017216 -0.456819 -0.889393\nv 0.398827 0.946649 -1.843899   \nvn 0.030227 -0.306410 -0.951420\nv 0.345109 1.608829 -2.100174   \nvn -0.229972 -0.816805 -0.529096\nv -2.356743 0.062032 -0.494700   \nvn -0.870183 -0.187289 0.455745\nv -3.001084 0.271460 2.560034   \nvn -0.610714 0.097136 -0.785871\nv -2.064663 0.303055 -0.697324   \nvn 0.117909 0.143781 -0.982560\nv 0.221271 3.174023 -2.374399   \nvn 0.123346 -0.325923 -0.937315\nv 0.195842 0.437865 -1.621473   \nvn 0.073137 -0.997211 0.014857\nv -0.385613 0.297763 1.960096   \nvn 0.300346 -0.945320 -0.127135\nv 1.999609 0.108928 -0.791250   \nvn 0.625655 0.140953 -0.767260\nv 0.351698 9.227494 -1.575650   \nvn -0.096365 -0.282757 -0.954338\nv 0.021477 2.191913 -2.309353   \nvn 0.129770 -0.054374 -0.990052\nv 0.246381 2.836575 -2.356365   \nvn -0.263287 -0.950394 0.165626\nv 1.543281 0.237539 1.901906   \nvn -0.464224 -0.273960 -0.842284\nv 0.031881 9.147022 -1.454203   \nvn -0.219788 -0.348943 -0.911006\nv -0.001881 1.648503 -2.108044   \nvn 0.048762 -0.281558 -0.958305\nv 0.333423 1.907088 -2.204533   \nvn 0.022656 -0.098460 -0.994883\nv 0.044063 2.634032 -2.368412   \nvn -0.089567 0.041543 -0.995114\nv -0.028148 3.053684 -2.390082   \nvn -0.069799 0.269827 -0.960376\nv 0.024130 3.342970 -2.365440   \nvn -0.492215 -0.174267 -0.852851\nv -0.272645 9.028790 -1.238685   \nvn -0.081246 -0.317354 -0.944820\nv -0.006348 0.832044 -1.758222   \nvn -0.405833 -0.341087 -0.847915\nv -0.321105 1.458754 -1.886313   \nvn -0.198519 -0.506293 -0.839201\nv -0.153948 8.618809 -1.105353   \nvn -0.460244 -0.177700 -0.869827\nv -0.409303 1.137783 -1.720556   \nvn -0.582435 -0.313027 -0.750189\nv -0.410054 1.742789 -1.957989   \nvn -0.293651 -0.240179 -0.925247\nv -0.287905 2.380404 -2.294509   \nvn -0.285971 -0.090389 -0.953966\nv -0.261375 2.646629 -2.356322   \nvn -0.218549 0.214373 -0.951988\nv -0.221986 3.215303 -2.345844   \nvn -0.078033 -0.056812 -0.995331\nv -0.316080 0.687581 -1.719010   \nvn -0.317885 0.230940 -0.919574\nv -0.537705 0.855802 -1.648585   \nvn -0.300413 -0.333519 -0.893598\nv -0.142834 1.193053 -1.873710   \nvn -0.369377 -0.348735 -0.861362\nv -0.243710 2.044435 -2.176958   \nvn -0.428334 -0.014996 -0.903496\nv -0.437999 2.959748 -2.299698   \nvn 0.177229 -0.663601 -0.726790\nv -0.788950 0.176226 -1.729046   \nvn 0.046607 0.076520 -0.995978\nv -0.608509 0.546932 -1.734032   \nvn -0.144759 0.383479 -0.912134\nv -0.693698 4.478782 -1.369372   \nvn -0.189343 -0.422993 -0.886130\nv -0.669153 8.469645 -0.911149   \nvn -0.715253 0.263963 -0.647099\nv -0.741857 1.082705 -1.458474   \nvn -0.601230 -0.257604 -0.756414\nv -0.554059 2.440325 -2.141785   \nvn 0.252476 -0.928650 0.271783\nv 2.092610 0.153182 2.575810   \nvn 0.057391 -0.996109 0.066877\nv 1.792547 0.111794 2.563777   \nvn 0.274379 -0.706958 0.651864\nv 1.855787 0.189541 2.835089   \nvn 0.137268 -0.658400 0.740045\nv 1.492601 0.232246 2.987681   \nvn 0.070355 -0.690123 0.720264\nv -0.284918 0.236687 3.429738   \nvn 0.070450 -0.996396 0.047238\nv 2.604841 0.119970 1.015060   \nvn 0.226553 -0.870755 0.436416\nv 0.331271 0.168113 3.124031   \nvn -0.027656 -0.979212 -0.200945\nv 0.280606 0.308368 2.495937   \nvn 0.017672 -0.999794 -0.009972\nv 0.544591 0.325711 2.081274   \nvn -0.018265 -0.952027 0.305469\nv 0.193145 0.191540 -0.977556   \nvn 0.430473 -0.893848 0.125414\nv 3.810099 0.423240 1.032202   \nvn 0.377910 -0.875793 0.300283\nv 3.546220 0.379245 1.392814   \nvn -0.120860 -0.992362 0.024695\nv 0.614020 0.276328 0.849356   \nvn -0.207840 -0.911106 0.355934\nv -1.198628 0.144953 2.911457   \nvn 0.474398 -0.844790 0.247539\nv 4.171990 0.680370 1.391526   \nvn -0.015578 -0.999876 0.002463\nv 0.882790 0.321339 2.059129   \nvn -0.079126 -0.996295 0.033702\nv 1.930350 0.109992 2.054154   \nvn -0.218999 -0.932710 -0.286515\nv 1.620331 0.121986 2.372030   \nvn 0.182371 -0.974583 0.130109\nv 2.374812 0.109210 1.734876   \nvn -0.029380 -0.976039 -0.215603\nv -0.031227 0.294412 2.593687   \nvn 0.484497 -0.866566 0.119691\nv 4.075018 0.561914 1.038065   \nvn 0.122247 -0.988648 -0.087357\nv -0.570366 0.126583 2.975558   \nvn -0.023698 -0.998138 0.056205\nv 0.950052 0.318463 1.804012   \nvn -0.182226 -0.981766 0.054122\nv 1.130034 0.117125 0.983850   \nvn 0.015346 -0.999144 0.038425\nv 2.123049 0.089460 1.665911   \nvn -0.014392 -0.999880 -0.005718\nv 2.087572 0.068621 0.335013   \nvn 0.189680 -0.943059 -0.273241\nv 2.927337 0.167117 0.289611   \nvn 0.183469 -0.581810 0.792361\nv 0.528876 0.313434 3.205969   \nvn -0.246325 -0.945059 0.214915\nv 1.174911 0.162744 1.328262   \nvn -0.948962 -0.251962 0.189700\nv -4.888440 5.595350 1.661134   \nvn -0.848314 -0.510975 0.138812\nv -4.709607 5.165338 1.324082   \nvn -0.192699 -0.972538 0.130525\nv 0.871199 0.277021 1.263831   \nvn -0.727013 -0.660849 0.186363\nv -3.910877 2.349318 1.272269   \nvn 0.036093 -0.971215 0.235454\nv 1.568240 0.118605 2.768112   \nvn -0.210567 -0.913097 0.349164\nv 1.179176 0.152617 -0.858003   \nvn -0.348213 -0.921957 -0.169540\nv 1.634629 0.247872 2.128625   \nvn -0.846002 -0.511714 0.149765\nv -4.627425 5.126935 1.617836   \nvn 0.409830 -0.842985 0.348448\nv 3.845542 0.549070 1.456010   \nvn 0.247446 -0.944283 0.217027\nv 2.654006 0.165508 1.637169   \nvn 0.221884 -0.974245 0.040175\nv -0.678324 0.264880 1.974741   \nvn 0.148958 -0.974545 -0.167551\nv 2.451139 0.100377 0.213768   \nvn -0.110009 -0.990795 -0.078883\nv 0.633199 0.286719 0.403357   \nvn 0.247297 -0.966576 0.067645\nv -0.533042 0.252400 1.373267   \nvn -0.277418 -0.958800 -0.061173\nv 0.993170 0.171106 0.624966   \nvn 0.027034 -0.999479 -0.017626\nv -0.100063 0.306466 2.170225   \nvn -0.045979 -0.995780 -0.079427\nv 1.245943 0.092351 0.661031   \nvn -0.245577 -0.966939 -0.068714\nv 1.390414 0.198996 -0.086400   \nvn -0.709802 -0.684968 0.164316\nv -4.457265 5.030531 2.138242   \nvn 0.199263 -0.968392 0.150036\nv 2.897760 0.146575 1.297468   \nvn -0.109302 -0.993833 0.018703\nv 1.802703 0.088824 -0.490405   \nvn -0.144435 -0.955392 -0.257614\nv 1.055447 0.309261 2.392437   \nvn 0.264375 -0.955895 0.127945\nv 2.300436 0.142429 2.104254   \nvn 0.446242 -0.852255 0.273001\nv 2.333990 0.187756 2.416935   \nvn 0.015997 -0.999865 0.003782\nv 2.325183 0.134349 0.574063   \nvn 0.563710 -0.538529 0.626273\nv 2.410924 0.370971 2.637115   \nvn 0.159599 -0.469879 0.868183\nv 1.132924 0.290511 3.061000   \nvn 0.078019 -0.995151 -0.059897\nv 1.764028 0.070212 -0.805350   \nvn 0.474508 -0.489634 0.731505\nv 2.156994 0.397657 2.844061   \nvn -0.142963 -0.901235 0.409070\nv 0.920711 0.225527 -0.882456   \nvn -0.571890 -0.699948 0.427802\nv -4.552135 5.240960 2.855140   \nvn 0.019010 -0.999774 -0.009473\nv 0.210016 0.309396 2.064296   \nvn 0.014862 -0.995552 0.093033\nv 0.612067 0.136815 -1.086002   \nvn 0.358554 -0.766562 0.532748\nv 3.150236 0.426757 1.802703   \nvn 0.072216 -0.996601 0.039631\nv -0.248240 0.282258 1.470997   \nvn -0.107344 -0.978205 0.177742\nv 0.974269 0.301311 -0.640898   \nvn -0.466768 -0.848329 0.249930\nv -4.401413 5.039660 2.535553   \nvn 0.009396 -0.963352 0.268076\nv 0.644319 0.274006 -0.817806   \nvn -0.000198 -0.998673 -0.051494\nv 0.332922 0.309077 0.108474   \nvn 0.425661 -0.902414 -0.066799\nv 3.610001 0.317447 0.689353   \nvn 0.321547 -0.829087 -0.457408\nv 3.335681 0.358195 0.118477   \nvn -0.008486 -0.998358 0.056659\nv 0.623544 0.318983 -0.419300   \nvn 0.036533 -0.999001 0.025738\nv -0.110120 0.307747 1.831331   \nvn 0.061672 -0.997864 -0.021525\nv -0.407528 0.291044 2.282935   \nvn 0.020689 -0.999626 0.017914\nv 0.069783 0.285095 0.950289   \nvn -0.104214 -0.994286 -0.023138\nv 0.970135 0.310392 -0.283742   \nvn -0.089154 -0.989663 -0.112333\nv 0.840564 0.306898 0.098854   \nvn 0.131491 -0.989575 0.058748\nv -0.541827 0.267753 1.683795   \nvn -0.723805 -0.177751 0.666717\nv -3.956082 4.557130 2.297164   \nvn -0.809975 -0.507700 0.293566\nv -4.161036 2.834481 1.641830   \nvn -0.273105 -0.843795 0.461978\nv -4.093952 4.977551 2.747747   \nvn 0.465248 -0.833593 0.297771\nv 2.661819 0.261867 1.926145   \nvn -0.676519 -0.735906 -0.027636\nv -3.749926 2.161875 0.895238   \nvn -0.777877 -0.484049 0.400754\nv -2.497776 1.362900 0.791855   \nvn -0.016669 -0.998266 0.056453\nv 0.691482 0.304968 1.582939   \nvn -0.521598 -0.734157 0.434683\nv -4.013193 4.830963 2.476900   \nvn -0.637120 -0.748527 0.183809\nv -3.639585 2.091265 1.304415   \nvn -0.748710 -0.592926 0.296432\nv -3.976700 2.563053 1.628400   \nvn -0.707511 -0.544373 0.450650\nv -3.979915 2.788616 1.977977   \nvn 0.007255 -0.999494 0.030981\nv 0.388782 0.312656 1.709168   \nvn -0.510991 -0.859517 -0.010919\nv -3.408730 1.877324 0.851652   \nvn 0.031297 -0.755585 0.654302\nv -3.671637 5.136974 3.170734   \nvn -0.450560 -0.839862 -0.302699\nv -3.129640 1.852012 0.157682   \nvn -0.108158 -0.665775 0.738272\nv -3.629687 4.852698 2.686837   \nvn -0.478195 -0.862878 -0.163619\nv -3.196164 1.793459 0.452804   \nvn -0.644483 -0.691000 0.327354\nv -3.746338 2.313570 1.648551   \nvn 0.178942 -0.980514 -0.081065\nv 2.992192 0.125251 0.575976   \nvn -0.299488 -0.954100 -0.000618\nv -3.254051 0.054431 0.314152   \nvn -0.588562 -0.804480 0.080040\nv -3.474644 1.925288 1.134116   \nvn -0.502385 -0.802597 0.321631\nv -3.418372 2.022882 1.578901   \nvn -0.453062 -0.859476 -0.236719\nv -2.920955 1.705403 0.298420   \nvn -0.576706 -0.735745 0.355090\nv -3.572290 2.152022 1.607572   \nvn -0.493953 -0.771942 -0.400144\nv -3.251259 0.090130 -0.106174   \nvn -0.423958 -0.872950 0.241285\nv -3.299952 1.877781 1.348623   \nvn -0.626677 -0.632481 0.455240\nv -3.666819 2.441459 2.004838   \nvn -0.406473 -0.798312 -0.444384\nv -2.912646 1.824748 -0.045348   \nvn -0.510496 -0.600246 0.615710\nv -3.399511 2.479484 2.340393   \nvn -0.130135 -0.988770 -0.073476\nv -3.009754 0.015286 0.075567   \nvn -0.482936 -0.733209 0.478725\nv -3.381443 2.316937 2.156923   \nvn -0.453236 -0.788940 0.414910\nv -3.352801 2.133341 1.857366   \nvn -0.454528 -0.890398 -0.024399\nv -3.017880 1.687685 0.645867   \nvn -0.414842 -0.895740 0.159863\nv -2.931857 1.678712 1.158472   \nvn -0.565578 -0.692909 0.447213\nv -3.301008 0.088360 0.591001   \nvn -0.214515 -0.951650 0.219875\nv 1.358025 0.197950 1.599144   \nvn -0.386790 -0.859295 0.334674\nv -2.999565 1.845016 1.618396   \nvn -0.119416 -0.967866 -0.221305\nv -2.767957 0.028397 -0.196436   \nvn -0.358386 -0.789657 0.497998\nv -2.939620 2.078779 2.140593   \nvn -0.406138 -0.462840 0.787929\nv -3.346648 2.674056 2.518097   \nvn 0.315466 -0.941708 -0.116903\nv 3.324322 0.208220 0.628605   \nvn 0.168694 -0.982922 0.073530\nv 3.091677 0.137202 0.934500   \nvn -0.065665 -0.996933 0.042571\nv -2.881807 0.009952 0.318439   \nvn -0.331677 -0.856249 0.396016\nv -2.764946 1.786619 1.693439   \nvn -0.370998 -0.831966 0.412544\nv -2.905542 1.932343 1.900002   \nvn -0.355269 -0.723115 0.592358\nv -3.140854 2.271384 2.274946   \nvn -0.239101 -0.558797 0.794088\nv -2.889950 2.487856 2.574759   \nvn -0.034416 -0.994919 -0.094614\nv -2.367194 -0.000943 -0.155760   \nvn -0.227789 -0.945266 0.233633\nv -3.050738 0.068703 0.742988   \nvn -0.496740 -0.862263 0.098751\nv -2.759525 1.556790 0.877782   \nvn -0.324506 -0.604933 0.727153\nv -3.151775 2.480540 2.482749   \nvn -0.037697 -0.999197 -0.013599\nv -2.578618 -0.002885 0.165716   \nvn -0.327657 -0.832295 0.447130\nv -2.651618 1.877246 1.981189   \nvn -0.779769 -0.530978 -0.331698\nv -2.933973 0.133731 1.631023   \nvn -0.080956 -0.993470 -0.080402\nv 1.047628 0.100284 -1.085248   \nvn -0.380623 -0.917336 -0.116712\nv -1.585123 0.062083 -1.394896   \nvn 0.012972 -0.999856 0.010979\nv -2.287917 -0.002671 0.214434   \nvn -0.012690 -0.995568 0.093186\nv -2.524899 0.007481 0.471788   \nvn -0.293663 -0.684687 0.667057\nv -2.815492 2.188198 2.343294   \nvn 0.033128 -0.999332 -0.015429\nv -2.095142 -0.003149 -0.094574   \nvn 0.063646 -0.992586 0.103545\nv -2.172686 -0.000133 0.479630   \nvn -0.226859 -0.967558 -0.111203\nv -2.732704 0.074306 1.742079   \nvn -0.256414 -0.638221 0.725897\nv -2.496530 2.145668 2.426910   \nvn 0.023974 -0.992292 -0.121577\nv -1.343683 0.047721 -1.506391   \nvn -0.113840 -0.988586 0.098679\nv -2.581185 0.048703 0.975528   \nvn -0.350038 -0.936031 -0.036321\nv -2.905101 0.083158 2.010052   \nvn -0.300849 -0.765509 0.568758\nv -2.601514 2.007801 2.223089   \nvn -0.068431 -0.997281 -0.027357\nv -2.339464 0.026340 1.484304   \nvn -0.489051 -0.852696 0.183683\nv -2.907873 0.103670 2.378149   \nvn 0.130597 -0.981090 0.142855\nv -1.368796 0.062516 -1.049125   \nvn -0.022189 -0.992549 -0.119813\nv -1.932440 0.024430 -0.427603   \nvn -0.070537 -0.995609 0.061546\nv -2.705081 0.060513 2.303802   \nvn 0.347912 -0.936341 0.047156\nv 3.372155 0.206274 0.892293   \nvn -0.401842 -0.884947 -0.235355\nv -1.761827 0.093202 -1.037404   \nvn 0.189695 -0.977770 -0.089340\nv -1.700667 0.039700 -0.614221   \nvn 0.102357 -0.994543 -0.020167\nv -1.872291 0.011979 -0.135753   \nvn 0.044443 -0.998808 0.020172\nv -1.929257 0.074005 0.728999   \nvn -0.059062 -0.998109 0.017027\nv -2.520128 0.049665 1.990540   \nvn -0.141773 -0.962244 0.232351\nv -2.699411 0.100920 2.603116   \nvn 0.308183 -0.891114 0.333076\nv 3.211701 0.273020 1.423357   \nvn 0.207509 -0.977760 0.030434\nv -1.445362 0.137100 -0.626491   \nvn 0.344026 -0.853197 0.392048\nv 2.921332 0.259112 1.645525   \nvn 0.074792 -0.996300 -0.042333\nv -0.993242 0.058686 -1.408916   \nvn 0.149792 -0.932144 0.329652\nv -0.944986 0.157541 -1.097665   \nvn -0.004447 -0.998841 0.047933\nv -2.154301 0.032749 1.882001   \nvn -0.453190 -0.424203 0.784010\nv -2.108789 1.988557 2.442673   \nvn 0.199039 -0.978395 0.055911\nv -1.015659 0.254970 -0.416665   \nvn 0.070045 -0.997112 0.029361\nv -1.898411 0.015872 0.167150   \nvn 0.014073 -0.999627 0.023411\nv -1.585517 0.027121 0.453445   \nvn 0.005224 -0.993946 0.109741\nv -2.311105 0.061264 2.327061   \nvn -0.380781 -0.785062 0.488553\nv -2.637042 0.152224 2.832201   \nvn -0.266966 -0.414767 0.869884\nv -2.087515 2.292972 2.617585   \nvn 0.039287 -0.996541 -0.073231\nv -0.750611 0.056697 -1.504516   \nvn 0.054623 -0.993828 -0.096547\nv -0.472029 0.075654 -1.360203   \nvn 0.055322 -0.942259 0.330285\nv -0.710798 0.139244 -1.183863   \nvn 0.193268 -0.971910 0.134305\nv -0.977550 0.260520 -0.831167   \nvn 0.052347 -0.969687 0.238678\nv -0.655814 0.260843 -0.880068   \nvn 0.066538 -0.997764 -0.006293\nv -0.897513 0.275537 -0.133042   \nvn 0.020363 -0.985238 0.169978\nv -2.049194 0.084947 2.455422   \nvn -0.035834 -0.906864 -0.419896\nv -0.177837 0.076362 -1.449009   \nvn 0.042836 -0.998590 0.031351\nv -0.553393 0.279083 -0.595730   \nvn 0.007996 -0.995861 0.090539\nv -1.788636 0.061630 2.231198   \nvn -0.040922 -0.952982 0.300251\nv -0.347610 0.255578 -0.999614   \nvn 0.008157 -0.988296 0.152332\nv -1.398589 0.036482 0.658710   \nvn 0.199835 -0.979660 -0.018204\nv -1.133918 0.056170 0.694730   \nvn 0.092904 -0.995070 0.034702\nv -1.433690 0.058226 1.977865   \nvn -0.584627 -0.787032 0.196957\nv -2.505459 1.492266 1.192950   \n\nf 3//3 1662//1662 4//4\nf 1677//1677 8//8 7//7\nf 713//713 1695//1695 10//10\nf 4//4 1675//1675 1663//1663\nf 12//12 1673//1673 1//1\nf 1706//1706 1//1 2//2\nf 6//6 7//7 1675//1675\nf 5//5 6//6 1675//1675\nf 8//8 9//9 713//713\nf 3//3 1663//1663 11//11\nf 2//2 11//11 1706//1706\nf 12//12 1691//1691 1673//1673\nf 1706//1706 12//12 1//1\nf 6//6 1677//1677 7//7\nf 8//8 10//10 7//7\nf 8//8 713//713 10//10\nf 3//3 4//4 1663//1663\nf 4//4 5//5 1675//1675\nf 2//2 3//3 11//11\nf 13//13 83//83 1838//1838\nf 1809//1809 13//13 1800//1800\nf 1809//1809 1800//1800 1797//1797\nf 13//13 862//862 83//83\nf 862//862 1809//1809 14//14\nf 1809//1809 862//862 13//13\nf 1800//1800 13//13 1817//1817\nf 1681//1681 15//15 1445//1445\nf 16//16 18//18 17//17\nf 15//15 1679//1679 1701//1701\nf 17//17 18//18 1680//1680\nf 16//16 1661//1661 18//18\nf 15//15 1085//1085 1679//1679\nf 16//16 1709//1709 19//19\nf 16//16 19//19 1661//1661\nf 1681//1681 1085//1085 15//15\nf 1681//1681 16//16 1085//1085\nf 16//16 1681//1681 1709//1709\nf 794//794 814//814 120//120\nf 1077//1077 794//794 120//120\nf 1077//1077 1837//1837 23//23\nf 24//24 20//20 21//21\nf 22//22 1077//1077 23//23\nf 22//22 23//23 24//24\nf 24//24 21//21 22//22\nf 1077//1077 120//120 1837//1837\nf 807//807 635//635 471//471\nf 433//433 1350//1350 807//807\nf 252//252 43//43 126//126\nf 810//810 1172//1172 792//792\nf 954//954 632//632 828//828\nf 635//635 1211//1211 1177//1177\nf 158//158 1833//1833 1835//1835\nf 57//57 220//220 54//54\nf 127//127 39//39 84//84\nf 38//38 86//86 44//44\nf 60//60 1152//1152 1155//1155\nf 84//84 76//76 42//42\nf 78//78 86//86 139//139\nf 202//202 949//949 47//47\nf 1363//1363 37//37 38//38\nf 453//453 776//776 886//886\nf 1238//1238 96//96 105//105\nf 967//967 964//964 1263//1263\nf 86//86 78//78 44//44\nf 37//37 86//86 38//38\nf 1019//1019 440//440 1020//1020\nf 42//42 226//226 482//482\nf 86//86 84//84 128//128\nf 94//94 84//84 42//42\nf 936//936 973//973 963//963\nf 117//117 94//94 101//101\nf 99//99 83//83 814//814\nf 42//42 76//76 226//226\nf 299//299 752//752 55//55\nf 1022//1022 416//416 1019//1019\nf 78//78 139//139 129//129\nf 767//767 824//824 1348//1348\nf 594//594 122//122 574//574\nf 906//906 886//886 668//668\nf 787//787 745//745 748//748\nf 101//101 42//42 108//108\nf 605//605 335//335 766//766\nf 780//780 451//451 826//826\nf 969//969 963//963 970//970\nf 226//226 366//366 482//482\nf 366//366 284//284 197//197\nf 162//162 161//161 304//304\nf 876//876 400//400 159//159\nf 329//329 1818//1818 955//955\nf 63//63 62//62 1080//1080\nf 359//359 82//82 73//73\nf 75//75 212//212 134//134\nf 161//161 162//162 139//139\nf 92//92 63//63 1080//1080\nf 168//168 57//57 1406//1406\nf 57//57 168//168 220//220\nf 914//914 915//915 49//49\nf 345//345 58//58 103//103\nf 44//44 78//78 129//129\nf 1076//1076 98//98 1080//1080\nf 390//390 883//883 888//888\nf 220//220 109//109 54//54\nf 1243//1243 860//860 121//121\nf 605//605 841//841 619//619\nf 755//755 88//88 763//763\nf 198//198 37//37 1363//1363\nf 1440//1440 89//89 1201//1201\nf 1653//1653 305//305 90//90\nf 82//82 45//45 941//941\nf 446//446 464//464 152//152\nf 718//718 521//521 93//93\nf 130//130 117//117 101//101\nf 1667//1667 1812//1812 625//625\nf 1080//1080 98//98 92//92\nf 63//63 92//92 72//72\nf 689//689 899//899 527//527\nf 464//464 75//75 134//134\nf 279//279 827//827 100//100\nf 962//962 373//373 43//43\nf 800//800 95//95 1008//1008\nf 101//101 94//94 42//42\nf 1315//1315 944//944 1302//1302\nf 185//185 231//231 110//110\nf 876//876 1196//1196 232//232\nf 134//134 177//177 190//190\nf 752//752 756//756 827//827\nf 102//102 103//103 58//58\nf 1199//1199 514//514 118//118\nf 749//749 519//519 98//98\nf 1146//1146 1485//1485 1305//1305\nf 359//359 659//659 82//82\nf 972//972 673//673 994//994\nf 446//446 152//152 457//457\nf 253//253 622//622 123//123\nf 37//37 272//272 127//127\nf 86//86 37//37 127//127\nf 117//117 84//84 94//94\nf 142//142 172//172 1748//1748\nf 1082//1082 884//884 104//104\nf 1399//1399 1455//1455 150//150\nf 458//458 122//122 594//594\nf 128//128 117//117 304//304\nf 698//698 71//71 892//892\nf 458//458 892//892 1653//1653\nf 1059//1059 1669//1669 113//113\nf 519//519 131//131 98//98\nf 215//215 320//320 132//132\nf 186//186 1452//1452 1450//1450\nf 464//464 134//134 517//517\nf 1429//1429 124//124 178//178\nf 114//114 863//863 562//562\nf 216//216 249//249 137//137\nf 187//187 43//43 252//252\nf 128//128 84//84 117//117\nf 161//161 86//86 128//128\nf 163//163 130//130 141//141\nf 155//155 170//170 1081//1081\nf 170//170 171//171 1081//1081\nf 211//211 175//175 167//167\nf 1530//1530 1493//1493 1525//1525\nf 451//451 876//876 232//232\nf 400//400 876//876 451//451\nf 172//172 142//142 171//171\nf 114//114 1156//1156 453//453\nf 132//132 320//320 361//361\nf 45//45 176//176 905//905\nf 453//453 873//873 114//114\nf 747//747 755//755 408//408\nf 148//148 150//150 151//151\nf 310//310 391//391 1149//1149\nf 54//54 187//187 284//284\nf 758//758 159//159 798//798\nf 304//304 130//130 163//163\nf 430//430 304//304 163//163\nf 155//155 169//169 170//170\nf 674//674 165//165 194//194\nf 39//39 272//272 76//76\nf 321//321 289//289 1023//1023\nf 247//247 477//477 174//174\nf 176//176 549//549 905//905\nf 183//183 729//729 457//457\nf 200//200 171//171 170//170\nf 169//169 200//200 170//170\nf 200//200 172//172 171//171\nf 185//185 239//239 231//231\nf 247//247 248//248 181//181\nf 1497//1497 1484//1484 1468//1468\nf 148//148 151//151 149//149\nf 829//829 473//473 446//446\nf 54//54 109//109 187//187\nf 57//57 54//54 272//272\nf 187//187 962//962 43//43\nf 1343//1343 392//392 58//58\nf 1665//1665 158//158 1835//1835\nf 1071//1071 205//205 179//179\nf 179//179 205//205 180//180\nf 286//286 216//216 296//296\nf 693//693 56//56 361//361\nf 193//193 194//194 287//287\nf 360//360 674//674 210//210\nf 587//587 196//196 654//654\nf 122//122 90//90 574//574\nf 203//203 172//172 200//200\nf 239//239 516//516 312//312\nf 175//175 211//211 241//241\nf 175//175 106//106 167//167\nf 718//718 277//277 596//596\nf 1156//1156 1150//1150 453//453\nf 1406//1406 57//57 198//198\nf 54//54 284//284 31//31\nf 76//76 54//54 31//31\nf 46//46 236//236 1652//1652\nf 211//211 167//167 491//491\nf 182//182 194//194 193//193\nf 186//186 621//621 218//218\nf 27//27 799//799 760//760\nf 1071//1071 227//227 205//205\nf 221//221 188//188 180//180\nf 221//221 169//169 188//188\nf 203//203 223//223 172//172\nf 360//360 210//210 182//182\nf 183//183 457//457 737//737\nf 965//965 168//168 1406//1406\nf 77//77 251//251 415//415\nf 808//808 1281//1281 1834//1834\nf 71//71 884//884 1653//1653\nf 228//228 180//180 205//205\nf 222//222 200//200 169//169\nf 222//222 203//203 200//200\nf 361//361 495//495 132//132\nf 215//215 242//242 320//320\nf 106//106 248//248 167//167\nf 206//206 204//204 261//261\nf 389//389 481//481 940//940\nf 483//483 856//856 212//212\nf 9//9 808//808 1834//1834\nf 227//227 256//256 205//205\nf 229//229 222//222 169//169\nf 167//167 174//174 491//491\nf 702//702 370//370 703//703\nf 212//212 856//856 263//263\nf 632//632 921//921 631//631\nf 1449//1449 1148//1148 1585//1585\nf 256//256 228//228 205//205\nf 238//238 221//221 180//180\nf 229//229 169//169 221//221\nf 223//223 257//257 556//556\nf 216//216 260//260 280//280\nf 127//127 272//272 39//39\nf 109//109 51//51 187//187\nf 228//228 237//237 180//180\nf 237//237 238//238 180//180\nf 221//221 238//238 229//229\nf 229//229 203//203 222//222\nf 257//257 223//223 203//203\nf 556//556 257//257 230//230\nf 260//260 153//153 280//280\nf 28//28 1297//1297 32//32\nf 187//187 51//51 962//962\nf 962//962 235//235 373//373\nf 1652//1652 236//236 813//813\nf 1573//1573 1148//1148 1449//1449\nf 256//256 227//227 1779//1779\nf 256//256 237//237 228//228\nf 257//257 258//258 230//230\nf 107//107 185//185 110//110\nf 242//242 411//411 189//189\nf 178//178 579//579 621//621\nf 210//210 674//674 182//182\nf 1137//1137 1458//1458 80//80\nf 1508//1508 246//246 719//719\nf 256//256 274//274 237//237\nf 276//276 411//411 242//242\nf 207//207 852//852 251//251\nf 1460//1460 254//254 1596//1596\nf 1407//1407 678//678 1651//1651\nf 229//229 275//275 203//203\nf 203//203 282//282 257//257\nf 349//349 240//240 497//497\nf 206//206 173//173 204//204\nf 370//370 249//249 703//703\nf 262//262 551//551 219//219\nf 262//262 466//466 551//551\nf 575//575 244//244 567//567\nf 922//922 901//901 1221//1221\nf 292//292 274//274 256//256\nf 349//349 239//239 266//266\nf 110//110 231//231 195//195\nf 150//150 381//381 324//324\nf 444//444 271//271 422//422\nf 273//273 292//292 256//256\nf 275//275 229//229 238//238\nf 275//275 293//293 203//203\nf 282//282 258//258 257//257\nf 277//277 544//544 342//342\nf 153//153 260//260 276//276\nf 1112//1112 832//832 250//250\nf 633//633 557//557 365//365\nf 300//300 274//274 292//292\nf 300//300 237//237 274//274\nf 281//281 238//238 237//237\nf 203//203 293//293 282//282\nf 248//248 247//247 174//174\nf 283//283 50//50 67//67\nf 1621//1621 1234//1234 1554//1554\nf 300//300 281//281 237//237\nf 281//281 306//306 238//238\nf 238//238 306//306 275//275\nf 307//307 293//293 275//275\nf 331//331 258//258 282//282\nf 247//247 195//195 265//265\nf 167//167 248//248 174//174\nf 913//913 895//895 897//897\nf 612//612 321//321 245//245\nf 1155//1155 1021//1021 908//908\nf 970//970 963//963 291//291\nf 273//273 300//300 292//292\nf 306//306 319//319 275//275\nf 146//146 213//213 241//241\nf 165//165 249//249 286//286\nf 260//260 278//278 276//276\nf 194//194 165//165 296//296\nf 270//270 241//241 211//211\nf 1034//1034 289//289 321//321\nf 47//47 949//949 207//207\nf 337//337 281//281 300//300\nf 331//331 282//282 293//293\nf 258//258 308//308 301//301\nf 370//370 137//137 249//249\nf 146//146 241//241 270//270\nf 503//503 85//85 466//466\nf 194//194 296//296 287//287\nf 165//165 286//286 296//296\nf 283//283 303//303 50//50\nf 162//162 304//304 430//430\nf 319//319 307//307 275//275\nf 307//307 331//331 293//293\nf 316//316 258//258 331//331\nf 316//316 308//308 258//258\nf 308//308 353//353 301//301\nf 301//301 353//353 309//309\nf 276//276 278//278 404//404\nf 354//354 1142//1142 334//334\nf 1421//1421 426//426 48//48\nf 612//612 314//314 321//321\nf 86//86 127//127 84//84\nf 129//129 1181//1181 44//44\nf 304//304 117//117 130//130\nf 281//281 315//315 306//306\nf 315//315 319//319 306//306\nf 191//191 182//182 243//243\nf 204//204 215//215 132//132\nf 821//821 796//796 816//816\nf 323//323 300//300 273//273\nf 323//323 337//337 300//300\nf 316//316 340//340 308//308\nf 173//173 153//153 618//618\nf 173//173 215//215 204//204\nf 322//322 1034//1034 321//321\nf 1402//1402 942//942 947//947\nf 86//86 161//161 139//139\nf 977//977 455//455 952//952\nf 748//748 61//61 787//787\nf 318//318 323//323 273//273\nf 340//340 353//353 308//308\nf 267//267 34//34 868//868\nf 164//164 225//225 219//219\nf 248//248 615//615 181//181\nf 649//649 640//640 554//554\nf 389//389 173//173 206//206\nf 612//612 346//346 314//314\nf 314//314 346//346 321//321\nf 161//161 128//128 304//304\nf 455//455 673//673 952//952\nf 318//318 330//330 323//323\nf 315//315 281//281 337//337\nf 307//307 339//339 331//331\nf 331//331 340//340 316//316\nf 1237//1237 116//116 437//437\nf 343//343 322//322 321//321\nf 1047//1047 356//356 329//329\nf 329//329 347//347 326//326\nf 326//326 347//347 318//318\nf 368//368 315//315 337//337\nf 315//315 338//338 319//319\nf 338//338 307//307 319//319\nf 339//339 344//344 331//331\nf 343//343 321//321 346//346\nf 356//356 350//350 329//329\nf 347//347 330//330 318//318\nf 348//348 337//337 323//323\nf 315//315 363//363 338//338\nf 331//331 344//344 340//340\nf 341//341 309//309 353//353\nf 136//136 907//907 1023//1023\nf 240//240 157//157 492//492\nf 195//195 231//231 487//487\nf 41//41 1016//1016 1004//1004\nf 322//322 356//356 1047//1047\nf 330//330 383//383 323//323\nf 383//383 348//348 323//323\nf 348//348 368//368 337//337\nf 338//338 372//372 307//307\nf 307//307 372//372 339//339\nf 1682//1682 297//297 1494//1494\nf 287//287 173//173 389//389\nf 231//231 349//349 487//487\nf 349//349 184//184 487//487\nf 385//385 333//333 831//831\nf 329//329 350//350 347//347\nf 368//368 363//363 315//315\nf 372//372 344//344 339//339\nf 340//340 352//352 353//353\nf 58//58 345//345 79//79\nf 343//343 356//356 322//322\nf 387//387 347//347 350//350\nf 387//387 351//351 347//347\nf 347//347 351//351 330//330\nf 348//348 367//367 368//368\nf 344//344 364//364 340//340\nf 324//324 381//381 325//325\nf 153//153 276//276 242//242\nf 346//346 1046//1046 343//343\nf 351//351 375//375 330//330\nf 340//340 364//364 352//352\nf 235//235 341//341 353//353\nf 354//354 362//362 355//355\nf 41//41 35//35 1016//1016\nf 374//374 356//356 343//343\nf 374//374 350//350 356//356\nf 375//375 383//383 330//330\nf 367//367 348//348 383//383\nf 372//372 364//364 344//344\nf 352//352 380//380 353//353\nf 380//380 373//373 353//353\nf 373//373 235//235 353//353\nf 157//157 191//191 492//492\nf 320//320 242//242 693//693\nf 355//355 362//362 32//32\nf 367//367 378//378 368//368\nf 364//364 380//380 352//352\nf 134//134 591//591 517//517\nf 198//198 57//57 272//272\nf 1046//1046 371//371 343//343\nf 371//371 374//374 343//343\nf 375//375 351//351 387//387\nf 378//378 367//367 383//383\nf 368//368 396//396 363//363\nf 401//401 338//338 363//363\nf 401//401 372//372 338//338\nf 379//379 364//364 372//372\nf 107//107 110//110 615//615\nf 182//182 674//674 194//194\nf 954//954 921//921 632//632\nf 377//377 350//350 374//374\nf 377//377 387//387 350//350\nf 379//379 380//380 364//364\nf 225//225 376//376 219//219\nf 280//280 153//153 173//173\nf 362//362 620//620 382//382\nf 1348//1348 824//824 796//796\nf 761//761 858//858 385//385\nf 393//393 375//375 387//387\nf 395//395 396//396 368//368\nf 384//384 372//372 401//401\nf 384//384 379//379 372//372\nf 219//219 376//376 262//262\nf 198//198 272//272 37//37\nf 415//415 455//455 977//977\nf 386//386 377//377 374//374\nf 1052//1052 383//383 375//375\nf 388//388 395//395 368//368\nf 378//378 388//388 368//368\nf 396//396 401//401 363//363\nf 280//280 173//173 296//296\nf 31//31 366//366 226//226\nf 451//451 232//232 826//826\nf 386//386 374//374 371//371\nf 399//399 375//375 393//393\nf 1052//1052 378//378 383//383\nf 397//397 379//379 384//384\nf 349//349 497//497 184//184\nf 296//296 173//173 287//287\nf 358//358 270//270 496//496\nf 1149//1149 391//391 1412//1412\nf 76//76 31//31 226//226\nf 207//207 77//77 55//55\nf 413//413 387//387 377//377\nf 413//413 393//393 387//387\nf 397//397 384//384 401//401\nf 652//652 115//115 879//879\nf 124//124 1242//1242 507//507\nf 239//239 312//312 266//266\nf 382//382 654//654 30//30\nf 619//619 816//816 335//335\nf 428//428 1033//1033 412//412\nf 299//299 415//415 977//977\nf 792//792 333//333 385//385\nf 130//130 101//101 141//141\nf 413//413 405//405 393//393\nf 393//393 405//405 399//399\nf 141//141 108//108 361//361\nf 396//396 395//395 401//401\nf 424//424 380//380 379//379\nf 386//386 413//413 377//377\nf 407//407 95//95 59//59\nf 420//420 416//416 1022//1022\nf 423//423 424//424 379//379\nf 424//424 126//126 380//380\nf 259//259 509//509 239//239\nf 312//312 157//157 266//266\nf 214//214 288//288 492//492\nf 450//450 412//412 1025//1025\nf 413//413 1069//1069 405//405\nf 56//56 141//141 361//361\nf 77//77 415//415 55//55\nf 395//395 417//417 401//401\nf 401//401 417//417 397//397\nf 423//423 379//379 397//397\nf 1259//1259 797//797 790//790\nf 428//428 412//412 450//450\nf 428//428 298//298 1033//1033\nf 1386//1386 1367//1367 484//484\nf 418//418 449//449 285//285\nf 1508//1508 342//342 246//246\nf 163//163 141//141 445//445\nf 659//659 45//45 82//82\nf 434//434 126//126 424//424\nf 439//439 252//252 126//126\nf 430//430 163//163 440//440\nf 1343//1343 58//58 1349//1349\nf 766//766 767//767 443//443\nf 698//698 892//892 696//696\nf 1058//1058 397//397 417//417\nf 441//441 424//424 423//423\nf 441//441 434//434 424//424\nf 434//434 439//439 126//126\nf 439//439 197//197 252//252\nf 75//75 483//483 212//212\nf 1137//1137 80//80 145//145\nf 30//30 196//196 425//425\nf 243//243 1005//1005 493//493\nf 58//58 758//758 29//29\nf 415//415 299//299 55//55\nf 239//239 349//349 231//231\nf 225//225 164//164 125//125\nf 296//296 216//216 280//280\nf 496//496 270//270 491//491\nf 450//450 447//447 428//428\nf 447//447 298//298 428//428\nf 1021//1021 1164//1164 910//910\nf 129//129 139//139 420//420\nf 67//67 981//981 444//444\nf 416//416 440//440 1019//1019\nf 112//112 397//397 1058//1058\nf 112//112 423//423 397//397\nf 841//841 250//250 832//832\nf 594//594 665//665 597//597\nf 219//219 551//551 156//156\nf 110//110 195//195 181//181\nf 484//484 269//269 856//856\nf 162//162 416//416 420//420\nf 1738//1738 233//233 429//429\nf 361//361 108//108 495//495\nf 1007//1007 1012//1012 411//411\nf 445//445 141//141 56//56\nf 920//920 844//844 431//431\nf 191//191 243//243 214//214\nf 276//276 404//404 411//411\nf 132//132 495//495 489//489\nf 450//450 664//664 447//447\nf 139//139 162//162 420//420\nf 129//129 420//420 35//35\nf 440//440 163//163 445//445\nf 461//461 441//441 423//423\nf 441//441 439//439 434//434\nf 473//473 75//75 446//446\nf 492//492 191//191 214//214\nf 239//239 509//509 516//516\nf 47//47 207//207 55//55\nf 973//973 945//945 963//963\nf 1242//1242 1429//1429 1285//1285\nf 112//112 461//461 423//423\nf 471//471 433//433 807//807\nf 249//249 165//165 703//703\nf 1026//1026 468//468 454//454\nf 554//554 1236//1236 649//649\nf 264//264 115//115 882//882\nf 268//268 294//294 897//897\nf 470//470 439//439 441//441\nf 456//456 197//197 439//439\nf 288//288 243//243 493//493\nf 240//240 266//266 157//157\nf 214//214 243//243 288//288\nf 1685//1685 747//747 64//64\nf 664//664 475//475 447//447\nf 416//416 162//162 430//430\nf 141//141 101//101 108//108\nf 1056//1056 460//460 468//468\nf 470//470 456//456 439//439\nf 260//260 543//543 278//278\nf 447//447 475//475 467//467\nf 447//447 467//467 448//448\nf 440//440 445//445 1020//1020\nf 615//615 110//110 181//181\nf 191//191 360//360 182//182\nf 157//157 498//498 191//191\nf 727//727 475//475 664//664\nf 1024//1024 459//459 460//460\nf 462//462 441//441 461//461\nf 270//270 211//211 491//491\nf 247//247 181//181 195//195\nf 591//591 134//134 190//190\nf 164//164 219//219 156//156\nf 468//468 469//469 454//454\nf 1064//1064 1030//1030 112//112\nf 112//112 1030//1030 461//461\nf 1030//1030 465//465 461//461\nf 462//462 470//470 441//441\nf 151//151 150//150 324//324\nf 829//829 446//446 457//457\nf 376//376 503//503 262//262\nf 475//475 476//476 467//467\nf 574//574 427//427 463//463\nf 479//479 1024//1024 478//478\nf 479//479 459//459 1024//1024\nf 459//459 480//480 468//468\nf 460//460 459//459 468//468\nf 469//469 394//394 454//454\nf 465//465 462//462 461//461\nf 485//485 366//366 456//456\nf 1233//1233 183//183 1381//1381\nf 173//173 618//618 215//215\nf 548//548 695//695 278//278\nf 543//543 548//548 278//278\nf 185//185 259//259 239//239\nf 262//262 503//503 466//466\nf 468//468 480//480 469//469\nf 485//485 456//456 470//470\nf 1381//1381 183//183 865//865\nf 476//476 477//477 467//467\nf 81//81 448//448 477//477\nf 467//467 477//477 448//448\nf 416//416 430//430 440//440\nf 480//480 488//488 469//469\nf 488//488 288//288 469//469\nf 493//493 394//394 469//469\nf 261//261 470//470 462//462\nf 482//482 366//366 485//485\nf 532//532 474//474 932//932\nf 693//693 361//361 320//320\nf 727//727 496//496 475//475\nf 469//469 288//288 493//493\nf 481//481 465//465 1030//1030\nf 261//261 462//462 465//465\nf 495//495 482//482 485//485\nf 75//75 473//473 483//483\nf 175//175 241//241 213//213\nf 224//224 107//107 615//615\nf 487//487 478//478 486//486\nf 479//479 497//497 459//459\nf 492//492 488//488 480//480\nf 124//124 403//403 178//178\nf 489//489 470//470 261//261\nf 489//489 485//485 470//470\nf 266//266 240//240 349//349\nf 249//249 216//216 286//286\nf 475//475 491//491 476//476\nf 478//478 487//487 479//479\nf 459//459 497//497 480//480\nf 240//240 492//492 480//480\nf 1585//1585 1148//1148 1335//1335\nf 489//489 495//495 485//485\nf 402//402 124//124 507//507\nf 496//496 491//491 475//475\nf 491//491 174//174 476//476\nf 81//81 477//477 265//265\nf 492//492 288//288 488//488\nf 481//481 1030//1030 1005//1005\nf 481//481 206//206 465//465\nf 174//174 477//477 476//476\nf 486//486 195//195 487//487\nf 487//487 184//184 479//479\nf 479//479 184//184 497//497\nf 497//497 240//240 480//480\nf 849//849 1167//1167 61//61\nf 269//269 263//263 856//856\nf 206//206 261//261 465//465\nf 261//261 204//204 489//489\nf 204//204 132//132 489//489\nf 247//247 265//265 477//477\nf 195//195 486//486 265//265\nf 1003//1003 311//311 1665//1665\nf 312//312 516//516 498//498\nf 516//516 360//360 498//498\nf 566//566 360//360 516//516\nf 1251//1251 1237//1237 302//302\nf 737//737 457//457 152//152\nf 655//655 175//175 568//568\nf 578//578 535//535 649//649\nf 520//520 506//506 646//646\nf 726//726 566//566 509//509\nf 151//151 1724//1724 149//149\nf 585//585 503//503 506//506\nf 585//585 527//527 503//503\nf 503//503 527//527 85//85\nf 608//608 192//192 683//683\nf 561//561 500//500 661//661\nf 608//608 518//518 192//192\nf 1039//1039 712//712 125//125\nf 952//952 673//673 972//972\nf 717//717 508//508 357//357\nf 869//869 514//514 1199//1199\nf 616//616 795//795 609//609\nf 683//683 192//192 175//175\nf 1314//1314 929//929 1212//1212\nf 618//618 242//242 215//215\nf 512//512 72//72 92//92\nf 409//409 801//801 793//793\nf 193//193 287//287 526//526\nf 81//81 486//486 448//448\nf 92//92 98//98 131//131\nf 1676//1676 325//325 889//889\nf 208//208 757//757 533//533\nf 583//583 1098//1098 1125//1125\nf 312//312 498//498 157//157\nf 511//511 131//131 147//147\nf 524//524 512//512 511//511\nf 609//609 709//709 617//617\nf 547//547 691//691 651//651\nf 512//512 528//528 359//359\nf 537//537 147//147 519//519\nf 466//466 419//419 551//551\nf 419//419 710//710 736//736\nf 521//521 515//515 501//501\nf 585//585 506//506 520//520\nf 537//537 519//519 510//510\nf 147//147 537//537 511//511\nf 539//539 528//528 512//512\nf 877//877 264//264 670//670\nf 647//647 525//525 606//606\nf 511//511 537//537 524//524\nf 528//528 176//176 359//359\nf 725//725 877//877 670//670\nf 722//722 725//725 675//675\nf 525//525 684//684 835//835\nf 559//559 510//510 523//523\nf 559//559 537//537 510//510\nf 524//524 539//539 512//512\nf 612//612 244//244 575//575\nf 529//529 707//707 557//557\nf 669//669 542//542 499//499\nf 524//524 538//538 539//539\nf 528//528 541//541 176//176\nf 533//533 757//757 534//534\nf 1014//1014 61//61 748//748\nf 552//552 699//699 700//700\nf 93//93 521//521 501//501\nf 536//536 537//537 559//559\nf 537//537 570//570 524//524\nf 539//539 541//541 528//528\nf 540//540 549//549 176//176\nf 568//568 213//213 146//146\nf 402//402 897//897 294//294\nf 535//535 676//676 640//640\nf 1511//1511 596//596 1508//1508\nf 558//558 546//546 531//531\nf 570//570 537//537 536//536\nf 538//538 541//541 539//539\nf 541//541 540//540 176//176\nf 570//570 538//538 524//524\nf 1136//1136 719//719 48//48\nf 588//588 682//682 627//627\nf 581//581 536//536 559//559\nf 100//100 748//748 279//279\nf 702//702 566//566 726//726\nf 666//666 133//133 515//515\nf 666//666 515//515 576//576\nf 133//133 550//550 654//654\nf 177//177 652//652 190//190\nf 66//66 48//48 267//267\nf 598//598 570//570 536//536\nf 570//570 582//582 538//538\nf 538//538 582//582 541//541\nf 564//564 540//540 541//541\nf 540//540 565//565 549//549\nf 1510//1510 1234//1234 1435//1435\nf 133//133 654//654 741//741\nf 551//551 711//711 156//156\nf 715//715 722//722 645//645\nf 411//411 1012//1012 189//189\nf 733//733 535//535 587//587\nf 561//561 563//563 730//730\nf 556//556 558//558 223//223\nf 581//581 559//559 546//546\nf 598//598 536//536 581//581\nf 582//582 564//564 541//541\nf 6//6 822//822 1677//1677\nf 577//577 216//216 137//137\nf 650//650 458//458 742//742\nf 565//565 540//540 564//564\nf 125//125 712//712 225//225\nf 551//551 669//669 711//711\nf 551//551 542//542 669//669\nf 566//566 702//702 674//674\nf 561//561 614//614 500//500\nf 234//234 533//533 626//626\nf 546//546 556//556 581//581\nf 602//602 582//582 570//570\nf 595//595 905//905 549//549\nf 1464//1464 1426//1426 435//435\nf 186//186 150//150 1455//1455\nf 722//722 675//675 645//645\nf 186//186 381//381 150//150\nf 578//578 425//425 587//587\nf 463//463 587//587 560//560\nf 598//598 602//602 570//570\nf 595//595 549//549 565//565\nf 567//567 604//604 575//575\nf 166//166 544//544 545//545\nf 458//458 90//90 122//122\nf 587//587 425//425 196//196\nf 726//726 588//588 607//607\nf 1079//1079 583//583 1125//1125\nf 589//589 926//926 867//867\nf 463//463 560//560 594//594\nf 190//190 879//879 591//591\nf 556//556 230//230 581//581\nf 603//603 564//564 582//582\nf 905//905 595//595 957//957\nf 435//435 1426//1426 1439//1439\nf 1025//1025 113//113 822//822\nf 573//573 588//588 627//627\nf 601//601 598//598 581//581\nf 600//600 592//592 657//657\nf 601//601 581//581 230//230\nf 602//602 623//623 582//582\nf 582//582 623//623 603//603\nf 603//603 565//565 564//564\nf 603//603 595//595 565//565\nf 604//604 612//612 575//575\nf 499//499 530//530 547//547\nf 698//698 1146//1146 71//71\nf 593//593 629//629 627//627\nf 611//611 598//598 601//601\nf 598//598 611//611 602//602\nf 223//223 558//558 172//172\nf 605//605 766//766 800//800\nf 574//574 463//463 594//594\nf 134//134 201//201 177//177\nf 730//730 608//608 628//628\nf 1012//1012 693//693 189//189\nf 519//519 147//147 131//131\nf 586//586 688//688 610//610\nf 683//683 628//628 608//608\nf 1713//1713 600//600 657//657\nf 563//563 593//593 608//608\nf 644//644 657//657 655//655\nf 258//258 601//601 230//230\nf 602//602 634//634 623//623\nf 624//624 595//595 603//603\nf 175//175 213//213 568//568\nf 726//726 607//607 702//702\nf 610//610 702//702 607//607\nf 611//611 634//634 602//602\nf 634//634 643//643 623//623\nf 381//381 217//217 325//325\nf 143//143 144//144 1250//1250\nf 502//502 733//733 587//587\nf 535//535 578//578 587//587\nf 649//649 1236//1236 578//578\nf 611//611 642//642 634//634\nf 311//311 1003//1003 1832//1832\nf 619//619 335//335 605//605\nf 1711//1711 146//146 270//270\nf 708//708 499//499 660//660\nf 502//502 587//587 463//463\nf 626//626 502//502 463//463\nf 727//727 664//664 692//692\nf 301//301 601//601 258//258\nf 642//642 611//611 601//601\nf 623//623 630//630 603//603\nf 603//603 630//630 624//624\nf 56//56 693//693 445//445\nf 519//519 749//749 510//510\nf 930//930 1516//1516 1412//1412\nf 621//621 579//579 268//268\nf 72//72 512//512 359//359\nf 708//708 669//669 499//499\nf 651//651 688//688 586//586\nf 601//601 301//301 642//642\nf 642//642 658//658 634//634\nf 1676//1676 889//889 1670//1670\nf 623//623 637//637 630//630\nf 506//506 503//503 376//376\nf 542//542 530//530 499//499\nf 333//333 421//421 1054//1054\nf 638//638 552//552 639//639\nf 535//535 640//640 649//649\nf 70//70 624//624 874//874\nf 301//301 513//513 642//642\nf 634//634 658//658 643//643\nf 563//563 661//661 580//580\nf 688//688 638//638 639//639\nf 710//710 647//647 606//606\nf 776//776 739//739 886//886\nf 560//560 550//550 133//133\nf 647//647 684//684 525//525\nf 642//642 513//513 658//658\nf 267//267 898//898 950//950\nf 1713//1713 644//644 1658//1658\nf 185//185 728//728 259//259\nf 675//675 725//725 670//670\nf 700//700 715//715 648//648\nf 629//629 660//660 573//573\nf 658//658 663//663 643//643\nf 572//572 882//882 652//652\nf 518//518 608//608 505//505\nf 599//599 707//707 529//529\nf 599//599 695//695 548//548\nf 641//641 553//553 561//561\nf 656//656 694//694 699//699\nf 699//699 694//694 722//722\nf 92//92 511//511 512//512\nf 145//145 302//302 1137//1137\nf 325//325 217//217 889//889\nf 871//871 765//765 1682//1682\nf 576//576 515//515 521//521\nf 277//277 545//545 544//544\nf 659//659 176//176 45//45\nf 646//646 506//506 712//712\nf 660//660 547//547 573//573\nf 701//701 525//525 656//656\nf 606//606 701//701 530//530\nf 267//267 868//868 898//898\nf 1696//1696 1527//1527 765//765\nf 580//580 660//660 629//629\nf 655//655 592//592 683//683\nf 587//587 550//550 560//560\nf 699//699 722//722 715//715\nf 897//897 402//402 507//507\nf 641//641 735//735 600//600\nf 665//665 666//666 576//576\nf 622//622 630//630 637//637\nf 1713//1713 657//657 644//644\nf 548//548 645//645 599//599\nf 711//711 669//669 708//708\nf 641//641 561//561 735//735\nf 656//656 699//699 552//552\nf 695//695 529//529 278//278\nf 513//513 663//663 658//658\nf 505//505 593//593 627//627\nf 689//689 585//585 520//520\nf 153//153 242//242 618//618\nf 588//588 726//726 682//682\nf 599//599 670//670 707//707\nf 527//527 671//671 85//85\nf 599//599 529//529 695//695\nf 711//711 708//708 500//500\nf 580//580 593//593 563//563\nf 661//661 660//660 580//580\nf 324//324 325//325 1135//1135\nf 327//327 896//896 474//474\nf 196//196 30//30 654//654\nf 85//85 671//671 916//916\nf 561//561 661//661 563//563\nf 505//505 627//627 682//682\nf 712//712 506//506 225//225\nf 652//652 882//882 115//115\nf 217//217 621//621 890//890\nf 1363//1363 679//679 198//198\nf 494//494 100//100 49//49\nf 1660//1660 692//692 681//681\nf 530//530 691//691 547//547\nf 431//431 844//844 710//710\nf 656//656 525//525 694//694\nf 175//175 192//192 106//106\nf 675//675 670//670 599//599\nf 99//99 713//713 83//83\nf 573//573 547//547 586//586\nf 73//73 62//62 72//72\nf 913//913 912//912 895//895\nf 107//107 224//224 185//185\nf 665//665 133//133 666//666\nf 844//844 647//647 710//710\nf 636//636 700//700 137//137\nf 700//700 699//699 715//715\nf 594//594 133//133 665//665\nf 689//689 527//527 585//585\nf 186//186 178//178 621//621\nf 534//534 676//676 535//535\nf 688//688 639//639 636//636\nf 1653//1653 90//90 458//458\nf 897//897 507//507 913//913\nf 133//133 741//741 515//515\nf 690//690 686//686 283//283\nf 692//692 450//450 681//681\nf 49//49 437//437 494//494\nf 137//137 700//700 648//648\nf 740//740 641//641 555//555\nf 550//550 587//587 654//654\nf 533//533 534//534 626//626\nf 1531//1531 696//696 650//650\nf 654//654 382//382 620//620\nf 737//737 152//152 532//532\nf 189//189 693//693 242//242\nf 178//178 403//403 579//579\nf 34//34 690//690 868//868\nf 690//690 34//34 686//686\nf 594//594 560//560 133//133\nf 950//950 66//66 267//267\nf 712//712 1039//1039 662//662\nf 940//940 481//481 1005//1005\nf 610//610 370//370 702//702\nf 617//617 553//553 616//616\nf 620//620 362//362 741//741\nf 152//152 464//464 517//517\nf 514//514 522//522 118//118\nf 692//692 664//664 450//450\nf 187//187 252//252 197//197\nf 334//334 303//303 328//328\nf 614//614 561//561 553//553\nf 617//617 614//614 553//553\nf 691//691 552//552 638//638\nf 661//661 708//708 660//660\nf 705//705 209//209 1204//1204\nf 419//419 736//736 551//551\nf 164//164 709//709 125//125\nf 525//525 835//835 694//694\nf 555//555 641//641 600//600\nf 246//246 342//342 166//166\nf 566//566 674//674 360//360\nf 156//156 711//711 709//709\nf 106//106 192//192 518//518\nf 1516//1516 199//199 1412//1412\nf 1710//1710 555//555 600//600\nf 61//61 290//290 787//787\nf 839//839 1296//1296 1400//1400\nf 534//534 535//535 626//626\nf 711//711 500//500 709//709\nf 557//557 633//633 411//411\nf 218//218 621//621 217//217\nf 592//592 628//628 683//683\nf 505//505 504//504 224//224\nf 644//644 655//655 568//568\nf 691//691 638//638 651//651\nf 546//546 558//558 556//556\nf 175//175 655//655 683//683\nf 720//720 692//692 1660//1660\nf 728//728 682//682 509//509\nf 646//646 712//712 662//662\nf 795//795 616//616 740//740\nf 566//566 516//516 509//509\nf 283//283 686//686 303//303\nf 1151//1151 398//398 1150//1150\nf 639//639 700//700 636//636\nf 545//545 686//686 34//34\nf 720//720 727//727 692//692\nf 1743//1743 1127//1127 1734//1734\nf 1725//1725 1476//1476 149//149\nf 557//557 411//411 404//404\nf 186//186 218//218 381//381\nf 504//504 505//505 682//682\nf 278//278 557//557 404//404\nf 33//33 1179//1179 159//159\nf 1713//1713 1710//1710 600//600\nf 606//606 530//530 542//542\nf 636//636 137//137 370//370\nf 688//688 636//636 370//370\nf 530//530 701//701 691//691\nf 701//701 552//552 691//691\nf 90//90 305//305 574//574\nf 626//626 535//535 733//733\nf 731//731 303//303 686//686\nf 504//504 682//682 728//728\nf 703//703 674//674 702//702\nf 731//731 328//328 303//303\nf 328//328 354//354 334//334\nf 597//597 665//665 576//576\nf 661//661 500//500 708//708\nf 586//586 547//547 651//651\nf 561//561 730//730 735//735\nf 701//701 656//656 552//552\nf 177//177 572//572 652//652\nf 518//518 505//505 224//224\nf 731//731 686//686 545//545\nf 1662//1662 1683//1683 727//727\nf 1683//1683 496//496 727//727\nf 1251//1251 302//302 918//918\nf 606//606 525//525 701//701\nf 610//610 688//688 370//370\nf 517//517 390//390 896//896\nf 1554//1554 687//687 1028//1028\nf 674//674 703//703 165//165\nf 657//657 592//592 655//655\nf 521//521 597//597 576//576\nf 403//403 124//124 402//402\nf 829//829 457//457 729//729\nf 1646//1646 678//678 1654//1654\nf 529//529 557//557 278//278\nf 639//639 552//552 700//700\nf 191//191 498//498 360//360\nf 277//277 731//731 545//545\nf 1118//1118 1526//1526 934//934\nf 1028//1028 687//687 1307//1307\nf 156//156 709//709 164//164\nf 710//710 606//606 542//542\nf 648//648 645//645 548//548\nf 651//651 638//638 688//688\nf 600//600 735//735 592//592\nf 579//579 294//294 268//268\nf 1683//1683 358//358 496//496\nf 511//511 92//92 131//131\nf 735//735 730//730 628//628\nf 577//577 543//543 216//216\nf 710//710 542//542 736//736\nf 736//736 542//542 551//551\nf 277//277 501//501 731//731\nf 501//501 328//328 731//731\nf 654//654 620//620 741//741\nf 415//415 852//852 455//455\nf 735//735 628//628 592//592\nf 730//730 563//563 608//608\nf 616//616 553//553 641//641\nf 526//526 182//182 193//193\nf 309//309 513//513 301//301\nf 224//224 504//504 728//728\nf 267//267 166//166 34//34\nf 93//93 501//501 277//277\nf 322//322 1047//1047 1034//1034\nf 586//586 610//610 607//607\nf 1201//1201 1560//1560 87//87\nf 629//629 573//573 627//627\nf 302//302 437//437 804//804\nf 715//715 645//645 648//648\nf 709//709 500//500 614//614\nf 722//722 694//694 725//725\nf 515//515 354//354 328//328\nf 354//354 741//741 362//362\nf 345//345 159//159 79//79\nf 709//709 614//614 617//617\nf 616//616 641//641 740//740\nf 501//501 515//515 328//328\nf 515//515 741//741 354//354\nf 1450//1450 178//178 186//186\nf 463//463 234//234 626//626\nf 852//852 406//406 1164//1164\nf 609//609 617//617 616//616\nf 648//648 543//543 577//577\nf 626//626 733//733 502//502\nf 1098//1098 583//583 1312//1312\nf 1236//1236 425//425 578//578\nf 580//580 629//629 593//593\nf 608//608 593//593 505//505\nf 25//25 433//433 471//471\nf 106//106 615//615 248//248\nf 105//105 743//743 472//472\nf 543//543 260//260 216//216\nf 366//366 197//197 456//456\nf 1421//1421 48//48 66//66\nf 224//224 728//728 185//185\nf 548//548 543//543 648//648\nf 573//573 586//586 607//607\nf 588//588 573//573 607//607\nf 263//263 781//781 1371//1371\nf 648//648 577//577 137//137\nf 645//645 675//675 599//599\nf 272//272 54//54 76//76\nf 728//728 509//509 259//259\nf 472//472 743//743 143//143\nf 506//506 376//376 225//225\nf 358//358 1711//1711 270//270\nf 726//726 509//509 682//682\nf 660//660 499//499 547//547\nf 744//744 1179//1179 33//33\nf 1196//1196 635//635 232//232\nf 1177//1177 25//25 471//471\nf 744//744 1111//1111 1179//1179\nf 136//136 810//810 858//858\nf 64//64 747//747 408//408\nf 635//635 1177//1177 471//471\nf 160//160 1113//1113 28//28\nf 1177//1177 1686//1686 25//25\nf 400//400 451//451 780//780\nf 1179//1179 857//857 876//876\nf 752//752 745//745 55//55\nf 437//437 49//49 773//773\nf 635//635 1109//1109 1211//1211\nf 770//770 1286//1286 1287//1287\nf 752//752 299//299 756//756\nf 747//747 1685//1685 755//755\nf 755//755 925//925 88//88\nf 723//723 1626//1626 757//757\nf 88//88 840//840 154//154\nf 490//490 796//796 821//821\nf 759//759 809//809 1519//1519\nf 840//840 841//841 154//154\nf 832//832 1112//1112 960//960\nf 1112//1112 750//750 960//960\nf 811//811 1254//1254 1364//1364\nf 1248//1248 1395//1395 714//714\nf 1389//1389 1330//1330 1202//1202\nf 1243//1243 121//121 762//762\nf 858//858 792//792 385//385\nf 759//759 1524//1524 809//809\nf 297//297 765//765 1505//1505\nf 71//71 1653//1653 892//892\nf 208//208 234//234 1639//1639\nf 1349//1349 58//58 29//29\nf 859//859 421//421 333//333\nf 965//965 1380//1380 1279//1279\nf 421//421 1195//1195 817//817\nf 785//785 1077//1077 1187//1187\nf 1077//1077 22//22 1187//1187\nf 1711//1711 768//768 2//2\nf 850//850 823//823 779//779\nf 807//807 138//138 788//788\nf 787//787 791//791 745//745\nf 791//791 55//55 745//745\nf 772//772 64//64 408//408\nf 786//786 853//853 819//819\nf 775//775 1824//1824 273//273\nf 896//896 152//152 517//517\nf 136//136 1023//1023 810//810\nf 100//100 827//827 49//49\nf 49//49 827//827 756//756\nf 809//809 706//706 409//409\nf 834//834 442//442 717//717\nf 1734//1734 744//744 33//33\nf 1386//1386 837//837 853//853\nf 773//773 828//828 738//738\nf 1006//1006 50//50 782//782\nf 794//794 1698//1698 814//814\nf 1519//1519 442//442 1538//1538\nf 1140//1140 1133//1133 860//860\nf 783//783 802//802 771//771\nf 1511//1511 1531//1531 677//677\nf 771//771 815//815 836//836\nf 232//232 788//788 826//826\nf 208//208 723//723 757//757\nf 27//27 772//772 799//799\nf 783//783 864//864 866//866\nf 833//833 55//55 791//791\nf 866//866 843//843 508//508\nf 800//800 766//766 95//95\nf 1176//1176 1262//1262 1354//1354\nf 801//801 409//409 806//806\nf 263//263 987//987 201//201\nf 793//793 801//801 815//815\nf 802//802 793//793 771//771\nf 705//705 1204//1204 1149//1149\nf 357//357 1515//1515 823//823\nf 166//166 545//545 34//34\nf 562//562 777//777 114//114\nf 1044//1044 739//739 776//776\nf 816//816 832//832 821//821\nf 774//774 793//793 802//802\nf 773//773 49//49 915//915\nf 773//773 738//738 804//804\nf 437//437 773//773 804//804\nf 809//809 818//818 706//706\nf 1625//1625 823//823 1528//1528\nf 589//589 1145//1145 789//789\nf 800//800 763//763 605//605\nf 822//822 1521//1521 1677//1677\nf 855//855 804//804 667//667\nf 829//829 483//483 473//473\nf 446//446 75//75 464//464\nf 832//832 490//490 821//821\nf 829//829 837//837 483//483\nf 717//717 783//783 764//764\nf 335//335 816//816 767//767\nf 816//816 824//824 767//767\nf 335//335 767//767 766//766\nf 820//820 806//806 838//838\nf 1717//1717 1522//1522 1413//1413\nf 1685//1685 925//925 755//755\nf 801//801 806//806 820//820\nf 1710//1710 830//830 555//555\nf 807//807 1350//1350 138//138\nf 100//100 1014//1014 748//748\nf 342//342 596//596 277//277\nf 818//818 811//811 819//819\nf 1177//1177 1692//1692 1686//1686\nf 764//764 783//783 866//866\nf 831//831 847//847 1053//1053\nf 866//866 1500//1500 843//843\nf 983//983 847//847 1054//1054\nf 848//848 833//833 791//791\nf 1179//1179 876//876 159//159\nf 818//818 819//819 706//706\nf 1303//1303 1393//1393 46//46\nf 97//97 418//418 285//285\nf 224//224 615//615 518//518\nf 357//357 508//508 1515//1515\nf 1167//1167 849//849 1180//1180\nf 1350//1350 433//433 27//27\nf 718//718 93//93 277//277\nf 771//771 836//836 864//864\nf 523//523 510//510 1746//1746\nf 848//848 842//842 833//833\nf 833//833 842//842 47//47\nf 830//830 740//740 555//555\nf 803//803 825//825 40//40\nf 398//398 1044//1044 776//776\nf 1568//1568 850//850 779//779\nf 1386//1386 484//484 856//856\nf 1350//1350 27//27 1347//1347\nf 442//442 802//802 783//783\nf 403//403 402//402 294//294\nf 1044//1044 668//668 739//739\nf 760//760 799//799 1008//1008\nf 820//820 838//838 729//729\nf 729//729 838//838 829//829\nf 838//838 853//853 829//829\nf 1538//1538 442//442 834//834\nf 149//149 1476//1476 148//148\nf 806//806 706//706 838//838\nf 717//717 442//442 783//783\nf 484//484 1372//1372 781//781\nf 815//815 820//820 845//845\nf 846//846 754//754 1337//1337\nf 1662//1662 720//720 5//5\nf 863//863 848//848 791//791\nf 738//738 828//828 667//667\nf 202//202 47//47 842//842\nf 811//811 786//786 819//819\nf 409//409 706//706 806//806\nf 1561//1561 1537//1537 850//850\nf 1586//1586 854//854 1787//1787\nf 8//8 1669//1669 808//808\nf 8//8 808//808 9//9\nf 823//823 1515//1515 1528//1528\nf 801//801 820//820 815//815\nf 848//848 863//863 842//842\nf 992//992 858//858 761//761\nf 706//706 819//819 838//838\nf 809//809 409//409 774//774\nf 403//403 294//294 579//579\nf 792//792 859//859 333//333\nf 1481//1481 1229//1229 1241//1241\nf 815//815 845//845 836//836\nf 786//786 1386//1386 853//853\nf 1133//1133 121//121 860//860\nf 1744//1744 1727//1727 685//685\nf 1705//1705 784//784 1280//1280\nf 1624//1624 1695//1695 1732//1732\nf 960//960 490//490 832//832\nf 1519//1519 809//809 774//774\nf 863//863 873//873 842//842\nf 442//442 774//774 802//802\nf 332//332 513//513 309//309\nf 381//381 218//218 217//217\nf 842//842 873//873 202//202\nf 819//819 853//853 838//838\nf 449//449 1481//1481 1241//1241\nf 857//857 1109//1109 1196//1196\nf 1528//1528 1515//1515 1527//1527\nf 820//820 183//183 1233//1233\nf 872//872 725//725 694//694\nf 853//853 837//837 829//829\nf 771//771 793//793 815//815\nf 804//804 738//738 667//667\nf 752//752 827//827 279//279\nf 1675//1675 1728//1728 1700//1700\nf 850//850 357//357 823//823\nf 872//872 694//694 835//835\nf 508//508 843//843 1515//1515\nf 1407//1407 1098//1098 870//870\nf 1329//1329 1350//1350 1347//1347\nf 824//824 816//816 796//796\nf 745//745 752//752 279//279\nf 1111//1111 857//857 1179//1179\nf 521//521 718//718 317//317\nf 872//872 835//835 684//684\nf 885//885 877//877 725//725\nf 166//166 267//267 48//48\nf 717//717 764//764 508//508\nf 217//217 890//890 889//889\nf 854//854 1586//1586 1571//1571\nf 1537//1537 717//717 357//357\nf 887//887 874//874 624//624\nf 783//783 771//771 864//864\nf 433//433 25//25 27//27\nf 684//684 883//883 872//872\nf 885//885 725//725 872//872\nf 115//115 877//877 885//885\nf 517//517 591//591 390//390\nf 12//12 1219//1219 1629//1629\nf 863//863 114//114 873//873\nf 887//887 624//624 630//630\nf 831//831 1053//1053 1121//1121\nf 763//763 154//154 605//605\nf 774//774 409//409 793//793\nf 764//764 866//866 508//508\nf 154//154 841//841 605//605\nf 883//883 885//885 872//872\nf 532//532 152//152 327//327\nf 887//887 891//891 874//874\nf 134//134 263//263 201//201\nf 820//820 1233//1233 845//845\nf 622//622 637//637 123//123\nf 646//646 893//893 520//520\nf 1131//1131 1077//1077 785//785\nf 115//115 264//264 877//877\nf 1671//1671 11//11 1664//1664\nf 912//912 671//671 895//895\nf 453//453 886//886 873//873\nf 873//873 886//886 202//202\nf 888//888 883//883 684//684\nf 879//879 885//885 883//883\nf 591//591 879//879 883//883\nf 891//891 868//868 690//690\nf 898//898 630//630 622//622\nf 898//898 887//887 630//630\nf 820//820 729//729 183//183\nf 520//520 894//894 689//689\nf 895//895 671//671 527//527\nf 899//899 895//895 527//527\nf 1537//1537 357//357 850//850\nf 811//811 1364//1364 786//786\nf 879//879 115//115 885//885\nf 880//880 889//889 893//893\nf 893//893 890//890 894//894\nf 894//894 899//899 689//689\nf 896//896 684//684 844//844\nf 896//896 888//888 684//684\nf 890//890 621//621 268//268\nf 591//591 883//883 390//390\nf 419//419 466//466 85//85\nf 950//950 898//898 622//622\nf 898//898 891//891 887//887\nf 890//890 268//268 894//894\nf 899//899 268//268 897//897\nf 532//532 327//327 474//474\nf 190//190 652//652 879//879\nf 844//844 684//684 647//647\nf 898//898 868//868 891//891\nf 889//889 890//890 893//893\nf 894//894 268//268 899//899\nf 897//897 895//895 899//899\nf 474//474 896//896 844//844\nf 896//896 390//390 888//888\nf 975//975 707//707 670//670\nf 514//514 1116//1116 522//522\nf 327//327 152//152 896//896\nf 810//810 792//792 858//858\nf 212//212 263//263 134//134\nf 921//921 924//924 948//948\nf 924//924 91//91 948//948\nf 91//91 26//26 948//948\nf 26//26 973//973 936//936\nf 65//65 432//432 900//900\nf 53//53 900//900 902//902\nf 904//904 906//906 60//60\nf 438//438 968//968 74//74\nf 840//840 1243//1243 762//762\nf 905//905 976//976 45//45\nf 918//918 302//302 145//145\nf 916//916 671//671 912//912\nf 906//906 202//202 886//886\nf 1685//1685 64//64 1686//1686\nf 1034//1034 1195//1195 289//289\nf 951//951 914//914 756//756\nf 913//913 919//919 912//912\nf 951//951 915//915 914//914\nf 507//507 919//919 913//913\nf 923//923 920//920 916//916\nf 912//912 923//923 916//916\nf 1005//1005 452//452 493//493\nf 1264//1264 554//554 640//640\nf 923//923 912//912 919//919\nf 631//631 921//921 948//948\nf 917//917 507//507 927//927\nf 917//917 919//919 507//507\nf 522//522 1116//1116 1099//1099\nf 917//917 923//923 919//919\nf 920//920 419//419 916//916\nf 84//84 39//39 76//76\nf 25//25 1686//1686 772//772\nf 111//111 1231//1231 1214//1214\nf 713//713 9//9 1838//1838\nf 923//923 931//931 920//920\nf 920//920 431//431 419//419\nf 1396//1396 1403//1403 1188//1188\nf 931//931 923//923 917//917\nf 595//595 624//624 70//70\nf 36//36 432//432 969//969\nf 36//36 969//969 970//970\nf 867//867 925//925 1685//1685\nf 1626//1626 1264//1264 676//676\nf 632//632 631//631 53//53\nf 931//931 932//932 920//920\nf 431//431 710//710 419//419\nf 303//303 334//334 50//50\nf 1447//1447 979//979 1139//1139\nf 800//800 1008//1008 799//799\nf 932//932 844//844 920//920\nf 948//948 26//26 65//65\nf 886//886 739//739 668//668\nf 1263//1263 964//964 965//965\nf 900//900 971//971 902//902\nf 1402//1402 947//947 939//939\nf 1118//1118 934//934 1092//1092\nf 1686//1686 64//64 772//772\nf 906//906 949//949 202//202\nf 980//980 938//938 981//981\nf 952//952 954//954 951//951\nf 938//938 271//271 444//444\nf 1155//1155 904//904 60//60\nf 1195//1195 955//955 1068//1068\nf 910//910 406//406 908//908\nf 851//851 1152//1152 60//60\nf 1770//1770 812//812 1433//1433\nf 77//77 207//207 251//251\nf 939//939 947//947 967//967\nf 966//966 928//928 943//943\nf 939//939 967//967 958//958\nf 956//956 976//976 905//905\nf 928//928 966//966 935//935\nf 53//53 52//52 632//632\nf 60//60 906//906 668//668\nf 432//432 936//936 969//969\nf 787//787 290//290 562//562\nf 253//253 123//123 672//672\nf 482//482 495//495 108//108\nf 955//955 1818//1818 1068//1068\nf 796//796 26//26 91//91\nf 959//959 966//966 946//946\nf 796//796 973//973 26//26\nf 903//903 984//984 956//956\nf 973//973 490//490 945//945\nf 1257//1257 30//30 425//425\nf 672//672 332//332 946//946\nf 947//947 959//959 964//964\nf 957//957 956//956 905//905\nf 903//903 956//956 957//957\nf 672//672 513//513 332//332\nf 946//946 332//332 962//962\nf 663//663 672//672 123//123\nf 672//672 663//663 513//513\nf 935//935 66//66 928//928\nf 631//631 948//948 53//53\nf 667//667 632//632 911//911\nf 851//851 60//60 668//668\nf 962//962 332//332 235//235\nf 1025//1025 412//412 1043//1043\nf 891//891 70//70 874//874\nf 253//253 672//672 946//946\nf 976//976 291//291 941//941\nf 284//284 187//187 197//197\nf 31//31 284//284 366//366\nf 951//951 756//756 299//299\nf 947//947 966//966 959//959\nf 986//986 291//291 976//976\nf 970//970 291//291 986//986\nf 406//406 852//852 207//207\nf 936//936 432//432 65//65\nf 942//942 1424//1424 1421//1421\nf 965//965 964//964 168//168\nf 943//943 253//253 946//946\nf 79//79 758//758 58//58\nf 50//50 1006//1006 67//67\nf 938//938 980//980 271//271\nf 632//632 667//667 828//828\nf 981//981 938//938 444//444\nf 67//67 690//690 283//283\nf 422//422 903//903 957//957\nf 948//948 65//65 53//53\nf 36//36 980//980 900//900\nf 952//952 972//972 954//954\nf 763//763 88//88 154//154\nf 28//28 32//32 382//382\nf 925//925 840//840 88//88\nf 947//947 964//964 967//967\nf 332//332 309//309 341//341\nf 958//958 967//967 1263//1263\nf 474//474 844//844 932//932\nf 954//954 972//972 921//921\nf 271//271 970//970 903//903\nf 936//936 963//963 969//969\nf 52//52 1006//1006 782//782\nf 970//970 984//984 903//903\nf 438//438 74//74 941//941\nf 70//70 422//422 957//957\nf 762//762 250//250 841//841\nf 264//264 975//975 670//670\nf 963//963 945//945 968//968\nf 963//963 438//438 291//291\nf 986//986 976//976 956//956\nf 908//908 406//406 949//949\nf 721//721 958//958 1263//1263\nf 26//26 936//936 65//65\nf 177//177 201//201 572//572\nf 109//109 946//946 51//51\nf 251//251 852//852 415//415\nf 201//201 987//987 572//572\nf 882//882 975//975 264//264\nf 828//828 773//773 954//954\nf 971//971 900//900 981//981\nf 30//30 160//160 28//28\nf 235//235 332//332 341//341\nf 949//949 406//406 207//207\nf 981//981 900//900 980//980\nf 987//987 985//985 572//572\nf 572//572 985//985 882//882\nf 991//991 707//707 975//975\nf 947//947 935//935 966//966\nf 971//971 981//981 67//67\nf 1114//1114 1487//1487 1555//1555\nf 985//985 982//982 882//882\nf 882//882 988//988 975//975\nf 690//690 67//67 444//444\nf 1006//1006 902//902 67//67\nf 984//984 986//986 956//956\nf 166//166 48//48 719//719\nf 988//988 991//991 975//975\nf 1371//1371 987//987 263//263\nf 902//902 971//971 67//67\nf 52//52 902//902 1006//1006\nf 982//982 988//988 882//882\nf 989//989 707//707 991//991\nf 943//943 946//946 966//966\nf 291//291 438//438 941//941\nf 65//65 900//900 53//53\nf 989//989 557//557 707//707\nf 942//942 935//935 947//947\nf 432//432 36//36 900//900\nf 997//997 990//990 985//985\nf 985//985 990//990 982//982\nf 982//982 990//990 988//988\nf 36//36 970//970 271//271\nf 1371//1371 996//996 987//987\nf 987//987 996//996 985//985\nf 990//990 1000//1000 988//988\nf 988//988 993//993 991//991\nf 993//993 989//989 991//991\nf 963//963 968//968 438//438\nf 952//952 951//951 977//977\nf 980//980 36//36 271//271\nf 422//422 271//271 903//903\nf 999//999 996//996 1371//1371\nf 988//988 1000//1000 993//993\nf 989//989 365//365 557//557\nf 970//970 986//986 984//984\nf 690//690 444//444 891//891\nf 996//996 1001//1001 985//985\nf 220//220 959//959 109//109\nf 999//999 1001//1001 996//996\nf 1000//1000 998//998 993//993\nf 915//915 954//954 773//773\nf 846//846 1337//1337 746//746\nf 807//807 788//788 232//232\nf 1001//1001 997//997 985//985\nf 990//990 997//997 1000//1000\nf 51//51 946//946 962//962\nf 444//444 422//422 70//70\nf 798//798 159//159 780//780\nf 1099//1099 1464//1464 435//435\nf 997//997 1010//1010 1000//1000\nf 1002//1002 989//989 993//993\nf 1002//1002 365//365 989//989\nf 904//904 908//908 906//906\nf 27//27 760//760 974//974\nf 998//998 1002//1002 993//993\nf 633//633 365//365 1002//1002\nf 1347//1347 27//27 974//974\nf 999//999 1009//1009 1001//1001\nf 1001//1001 1010//1010 997//997\nf 532//532 932//932 737//737\nf 253//253 950//950 622//622\nf 287//287 389//389 526//526\nf 1175//1175 1009//1009 999//999\nf 1010//1010 1011//1011 1000//1000\nf 1000//1000 1011//1011 998//998\nf 1015//1015 1002//1002 998//998\nf 615//615 106//106 518//518\nf 959//959 946//946 109//109\nf 526//526 1005//1005 243//243\nf 964//964 959//959 220//220\nf 234//234 427//427 305//305\nf 1001//1001 1009//1009 1010//1010\nf 1011//1011 1015//1015 998//998\nf 1002//1002 1007//1007 633//633\nf 825//825 414//414 40//40\nf 643//643 637//637 623//623\nf 481//481 389//389 206//206\nf 29//29 758//758 798//798\nf 1015//1015 1007//1007 1002//1002\nf 1007//1007 411//411 633//633\nf 976//976 941//941 45//45\nf 1235//1235 421//421 859//859\nf 55//55 833//833 47//47\nf 1010//1010 1013//1013 1011//1011\nf 168//168 964//964 220//220\nf 42//42 482//482 108//108\nf 1018//1018 1011//1011 1013//1013\nf 123//123 637//637 663//663\nf 940//940 526//526 389//389\nf 526//526 940//940 1005//1005\nf 951//951 954//954 915//915\nf 830//830 1736//1736 740//740\nf 1009//1009 881//881 1016//1016\nf 1009//1009 1016//1016 1010//1010\nf 1264//1264 640//640 676//676\nf 957//957 595//595 70//70\nf 796//796 91//91 1348//1348\nf 1180//1180 849//849 1014//1014\nf 760//760 1008//1008 974//974\nf 1010//1010 1016//1016 1013//1013\nf 1013//1013 1017//1017 1018//1018\nf 1018//1018 1015//1015 1011//1011\nf 1020//1020 1012//1012 1007//1007\nf 928//928 66//66 950//950\nf 650//650 317//317 596//596\nf 914//914 49//49 756//756\nf 977//977 951//951 299//299\nf 1004//1004 1016//1016 881//881\nf 1019//1019 1007//1007 1015//1015\nf 1022//1022 1019//1019 1015//1015\nf 445//445 693//693 1012//1012\nf 452//452 1030//1030 1064//1064\nf 1186//1186 852//852 1164//1164\nf 30//30 28//28 382//382\nf 182//182 526//526 243//243\nf 1022//1022 1015//1015 1018//1018\nf 1017//1017 1022//1022 1018//1018\nf 1019//1019 1020//1020 1007//1007\nf 1020//1020 445//445 1012//1012\nf 928//928 950//950 943//943\nf 452//452 394//394 493//493\nf 904//904 1155//1155 908//908\nf 392//392 102//102 58//58\nf 95//95 766//766 59//59\nf 420//420 1017//1017 1013//1013\nf 950//950 253//253 943//943\nf 908//908 1021//1021 910//910\nf 766//766 443//443 59//59\nf 95//95 407//407 909//909\nf 1008//1008 95//95 909//909\nf 35//35 1013//1013 1016//1016\nf 35//35 420//420 1013//1013\nf 420//420 1022//1022 1017//1017\nf 452//452 1058//1058 394//394\nf 908//908 949//949 906//906\nf 1035//1035 1074//1074 1040//1040\nf 1062//1062 907//907 1620//1620\nf 1069//1069 961//961 1035//1035\nf 472//472 1250//1250 105//105\nf 113//113 1025//1025 1043//1043\nf 373//373 380//380 126//126\nf 342//342 544//544 166//166\nf 142//142 1095//1095 171//171\nf 567//567 244//244 1062//1062\nf 399//399 1035//1035 1040//1040\nf 326//326 318//318 1824//1824\nf 1494//1494 297//297 1725//1725\nf 851//851 668//668 1044//1044\nf 1055//1055 298//298 1066//1066\nf 1620//1620 136//136 1075//1075\nf 1062//1062 244//244 907//907\nf 681//681 1025//1025 822//822\nf 1104//1104 97//97 1246//1246\nf 1441//1441 1124//1124 1492//1492\nf 1048//1048 1026//1026 1045//1045\nf 673//673 455//455 1232//1232\nf 1485//1485 698//698 1531//1531\nf 994//994 673//673 1232//1232\nf 179//179 155//155 1089//1089\nf 1045//1045 1042//1042 1067//1067\nf 113//113 1063//1063 1059//1059\nf 1531//1531 650//650 677//677\nf 179//179 1089//1089 1041//1041\nf 1047//1047 329//329 955//955\nf 244//244 245//245 1023//1023\nf 955//955 1195//1195 1034//1034\nf 1043//1043 412//412 1033//1033\nf 972//972 994//994 1057//1057\nf 961//961 1094//1094 1035//1035\nf 1755//1755 1339//1339 233//233\nf 386//386 1065//1065 413//413\nf 1058//1058 1064//1064 112//112\nf 749//749 1072//1072 1448//1448\nf 1531//1531 698//698 696//696\nf 972//972 1057//1057 1271//1271\nf 978//978 1060//1060 1212//1212\nf 650//650 742//742 317//317\nf 1061//1061 1453//1453 1031//1031\nf 354//354 355//355 1324//1324\nf 696//696 769//769 650//650\nf 399//399 405//405 1035//1035\nf 597//597 317//317 742//742\nf 1837//1837 120//120 14//14\nf 1514//1514 1116//1116 1529//1529\nf 884//884 1082//1082 1653//1653\nf 1040//1040 1074//1074 1049//1049\nf 463//463 427//427 234//234\nf 32//32 1297//1297 355//355\nf 1056//1056 1048//1048 1067//1067\nf 1033//1033 1055//1055 1046//1046\nf 1522//1522 311//311 1225//1225\nf 120//120 862//862 14//14\nf 1195//1195 1235//1235 289//289\nf 1110//1110 1772//1772 1071//1071\nf 1167//1167 1161//1161 777//777\nf 1045//1045 1036//1036 1042//1042\nf 1027//1027 961//961 1065//1065\nf 1051//1051 1033//1033 1046//1046\nf 1050//1050 1042//1042 388//388\nf 116//116 1014//1014 100//100\nf 1047//1047 955//955 1034//1034\nf 1322//1322 921//921 972//972\nf 612//612 1059//1059 346//346\nf 1049//1049 1067//1067 1050//1050\nf 1024//1024 1056//1056 1074//1074\nf 1030//1030 452//452 1005//1005\nf 119//119 1095//1095 142//142\nf 1095//1095 1081//1081 171//171\nf 1043//1043 1033//1033 1051//1051\nf 1027//1027 1065//1065 386//386\nf 16//16 17//17 1085//1085\nf 1097//1097 1080//1080 62//62\nf 1076//1076 1072//1072 749//749\nf 326//326 1818//1818 329//329\nf 910//910 1164//1164 406//406\nf 1023//1023 1235//1235 810//810\nf 375//375 399//399 1052//1052\nf 1083//1083 73//73 82//82\nf 1024//1024 1035//1035 1094//1094\nf 1818//1818 1795//1795 1068//1068\nf 87//87 1446//1446 1401//1401\nf 1508//1508 1536//1536 1511//1511\nf 1080//1080 1097//1097 1076//1076\nf 569//569 1479//1479 1105//1105\nf 1071//1071 179//179 1041//1041\nf 1035//1035 1024//1024 1074//1074\nf 777//777 1156//1156 114//114\nf 1104//1104 144//144 143//143\nf 1141//1141 82//82 74//74\nf 1083//1083 82//82 1141//1141\nf 1061//1061 1031//1031 937//937\nf 1041//1041 1087//1087 1110//1110\nf 371//371 1066//1066 386//386\nf 62//62 73//73 1083//1083\nf 1088//1088 1097//1097 1145//1145\nf 1041//1041 1089//1089 1087//1087\nf 1652//1652 813//813 753//753\nf 1063//1063 1051//1051 1046//1046\nf 188//188 155//155 179//179\nf 180//180 188//188 179//179\nf 1100//1100 1345//1345 1102//1102\nf 1669//1669 1059//1059 808//808\nf 1074//1074 1056//1056 1049//1049\nf 1100//1100 1337//1337 1345//1345\nf 1284//1284 944//944 1124//1124\nf 1050//1050 388//388 1052//1052\nf 1025//1025 681//681 450//450\nf 62//62 1083//1083 1101//1101\nf 968//968 750//750 1112//1112\nf 1440//1440 1038//1038 89//89\nf 743//743 1506//1506 143//143\nf 399//399 1040//1040 1052//1052\nf 1108//1108 1337//1337 1100//1100\nf 1345//1345 1543//1543 1102//1102\nf 143//143 1506//1506 1104//1104\nf 478//478 1094//1094 448//448\nf 478//478 1024//1024 1094//1094\nf 472//472 143//143 1250//1250\nf 1042//1042 1036//1036 395//395\nf 1329//1329 569//569 1105//1105\nf 62//62 1101//1101 1097//1097\nf 155//155 1093//1093 1089//1089\nf 113//113 1043//1043 1051//1051\nf 155//155 188//188 169//169\nf 436//436 236//236 46//46\nf 1076//1076 1097//1097 1088//1088\nf 98//98 1076//1076 749//749\nf 1050//1050 1067//1067 1042//1042\nf 817//817 1068//1068 1029//1029\nf 847//847 983//983 1143//1143\nf 1246//1246 97//97 285//285\nf 1093//1093 155//155 1081//1081\nf 1058//1058 452//452 1064//1064\nf 388//388 378//378 1052//1052\nf 1056//1056 1026//1026 1048//1048\nf 1076//1076 1088//1088 1090//1090\nf 1107//1107 1109//1109 857//857\nf 1069//1069 1035//1035 405//405\nf 1481//1481 1546//1546 869//869\nf 907//907 136//136 1620//1620\nf 1075//1075 992//992 1096//1096\nf 571//571 567//567 1062//1062\nf 1026//1026 454//454 1045//1045\nf 746//746 1337//1337 1108//1108\nf 1036//1036 1058//1058 417//417\nf 1093//1093 1103//1103 1130//1130\nf 1075//1075 136//136 992//992\nf 1106//1106 746//746 1108//1108\nf 448//448 1027//1027 447//447\nf 395//395 388//388 1042//1042\nf 74//74 82//82 941//941\nf 1119//1119 1109//1109 1107//1107\nf 1211//1211 1109//1109 875//875\nf 244//244 1023//1023 907//907\nf 413//413 1065//1065 1069//1069\nf 1281//1281 612//612 604//604\nf 961//961 448//448 1094//1094\nf 1052//1052 1040//1040 1050//1050\nf 1041//1041 1110//1110 1071//1071\nf 1472//1472 1038//1038 1440//1440\nf 70//70 891//891 444//444\nf 1378//1378 704//704 1375//1375\nf 1093//1093 1081//1081 1103//1103\nf 1097//1097 1101//1101 789//789\nf 1097//1097 789//789 1145//1145\nf 1115//1115 968//968 1112//1112\nf 447//447 1027//1027 298//298\nf 71//71 1113//1113 884//884\nf 454//454 394//394 1058//1058\nf 1119//1119 875//875 1109//1109\nf 1055//1055 371//371 1046//1046\nf 1081//1081 1095//1095 1103//1103\nf 1040//1040 1049//1049 1050//1050\nf 429//429 754//754 846//846\nf 1048//1048 1045//1045 1067//1067\nf 1045//1045 454//454 1036//1036\nf 1473//1473 732//732 1513//1513\nf 1127//1127 1122//1122 744//744\nf 744//744 1122//1122 1111//1111\nf 1033//1033 298//298 1055//1055\nf 1481//1481 869//869 1217//1217\nf 72//72 359//359 73//73\nf 1134//1134 968//968 1115//1115\nf 1106//1106 1120//1120 746//746\nf 1036//1036 454//454 1058//1058\nf 1027//1027 448//448 961//961\nf 455//455 852//852 1191//1191\nf 1031//1031 1478//1478 653//653\nf 590//590 817//817 1029//1029\nf 1111//1111 1122//1122 1107//1107\nf 1123//1123 1119//1119 1107//1107\nf 1117//1117 875//875 1119//1119\nf 1049//1049 1056//1056 1067//1067\nf 1195//1195 1068//1068 817//817\nf 745//745 279//279 748//748\nf 746//746 1121//1121 846//846\nf 846//846 1053//1053 429//429\nf 1106//1106 1781//1781 1120//1120\nf 1066//1066 298//298 386//386\nf 1099//1099 1530//1530 1464//1464\nf 732//732 1061//1061 937//937\nf 236//236 435//435 813//813\nf 1446//1446 1526//1526 1118//1118\nf 1107//1107 1122//1122 1123//1123\nf 1123//1123 1128//1128 1119//1119\nf 1128//1128 1117//1117 1119//1119\nf 1095//1095 119//119 1733//1733\nf 1120//1120 1121//1121 746//746\nf 1407//1407 1125//1125 1098//1098\nf 436//436 118//118 236//236\nf 1463//1463 1441//1441 1038//1038\nf 1127//1127 1130//1130 1122//1122\nf 1089//1089 1093//1093 1130//1130\nf 1134//1134 74//74 968//968\nf 1121//1121 1053//1053 846//846\nf 813//813 435//435 753//753\nf 1442//1442 1560//1560 1201//1201\nf 1132//1132 589//589 414//414\nf 1055//1055 1066//1066 371//371\nf 236//236 1099//1099 435//435\nf 1053//1053 1143//1143 429//429\nf 1738//1738 429//429 1143//1143\nf 1497//1497 1447//1447 1484//1484\nf 1183//1183 1084//1084 1655//1655\nf 1122//1122 1130//1130 1123//1123\nf 1733//1733 1117//1117 1128//1128\nf 769//769 458//458 650//650\nf 762//762 1115//1115 250//250\nf 1065//1065 961//961 1069//1069\nf 1136//1136 1482//1482 1137//1137\nf 1127//1127 953//953 1130//1130\nf 1088//1088 589//589 1132//1132\nf 1088//1088 1145//1145 589//589\nf 860//860 789//789 1140//1140\nf 1141//1141 1134//1134 1133//1133\nf 1134//1134 1141//1141 74//74\nf 1823//1823 571//571 1062//1062\nf 395//395 1036//1036 417//417\nf 1056//1056 1024//1024 460//460\nf 81//81 265//265 486//486\nf 1120//1120 1129//1129 1121//1121\nf 146//146 1659//1659 568//568\nf 696//696 892//892 769//769\nf 1130//1130 1103//1103 1123//1123\nf 1123//1123 1103//1103 1128//1128\nf 1417//1417 1078//1078 1414//1414\nf 298//298 1027//1027 386//386\nf 1053//1053 847//847 1143//1143\nf 1446//1446 1118//1118 1401//1401\nf 953//953 1087//1087 1130//1130\nf 1715//1715 1090//1090 1132//1132\nf 1132//1132 1090//1090 1088//1088\nf 1101//1101 1140//1140 789//789\nf 113//113 1051//1051 1063//1063\nf 1324//1324 355//355 1297//1297\nf 50//50 334//334 1142//1142\nf 1143//1143 983//983 1738//1738\nf 80//80 1458//1458 1092//1092\nf 1089//1089 1130//1130 1087//1087\nf 1103//1103 1095//1095 1128//1128\nf 1128//1128 1095//1095 1733//1733\nf 1101//1101 1083//1083 1140//1140\nf 1083//1083 1133//1133 1140//1140\nf 1083//1083 1141//1141 1133//1133\nf 1151//1151 1044//1044 398//398\nf 61//61 1167//1167 290//290\nf 1697//1697 1147//1147 1699//1699\nf 1298//1298 1203//1203 1314//1314\nf 410//410 1298//1298 1314//1314\nf 1235//1235 1195//1195 421//421\nf 1409//1409 1392//1392 1395//1395\nf 425//425 1236//1236 1244//1244\nf 1204//1204 310//310 1149//1149\nf 486//486 478//478 448//448\nf 1153//1153 1157//1157 851//851\nf 1154//1154 1150//1150 1156//1156\nf 1154//1154 1158//1158 1150//1150\nf 1150//1150 1153//1153 1151//1151\nf 1157//1157 1155//1155 1152//1152\nf 777//777 1154//1154 1156//1156\nf 1158//1158 1153//1153 1150//1150\nf 1218//1218 1394//1394 1209//1209\nf 1157//1157 1160//1160 1155//1155\nf 1154//1154 1166//1166 1158//1158\nf 1166//1166 1153//1153 1158//1158\nf 1160//1160 1021//1021 1155//1155\nf 1162//1162 1154//1154 777//777\nf 1162//1162 1166//1166 1154//1154\nf 1166//1166 1159//1159 1153//1153\nf 1153//1153 1159//1159 1157//1157\nf 1159//1159 1160//1160 1157//1157\nf 1167//1167 777//777 562//562\nf 1161//1161 1162//1162 777//777\nf 1162//1162 1165//1165 1166//1166\nf 1162//1162 1161//1161 1165//1165\nf 1159//1159 1163//1163 1160//1160\nf 1160//1160 1163//1163 1021//1021\nf 1271//1271 1322//1322 972//972\nf 1165//1165 1171//1171 1166//1166\nf 1166//1166 1163//1163 1159//1159\nf 1163//1163 1164//1164 1021//1021\nf 589//589 789//789 926//926\nf 1167//1167 1168//1168 1161//1161\nf 1166//1166 1171//1171 1163//1163\nf 1161//1161 1168//1168 1165//1165\nf 1163//1163 1171//1171 1164//1164\nf 1180//1180 1168//1168 1167//1167\nf 1168//1168 1169//1169 1165//1165\nf 1165//1165 1169//1169 1171//1171\nf 1169//1169 1170//1170 1171//1171\nf 1235//1235 1023//1023 289//289\nf 803//803 40//40 867//867\nf 1180//1180 1169//1169 1168//1168\nf 1170//1170 1174//1174 1171//1171\nf 1171//1171 1174//1174 1164//1164\nf 1174//1174 1186//1186 1164//1164\nf 1361//1361 1268//1268 1365//1365\nf 1170//1170 1186//1186 1174//1174\nf 612//612 245//245 244//244\nf 901//901 1227//1227 1377//1377\nf 1261//1261 1409//1409 1351//1351\nf 619//619 841//841 832//832\nf 1182//1182 1184//1184 1180//1180\nf 1180//1180 1185//1185 1169//1169\nf 1209//1209 1275//1275 1292//1292\nf 1184//1184 1185//1185 1180//1180\nf 1169//1169 1185//1185 1170//1170\nf 1388//1388 1396//1396 1255//1255\nf 1209//1209 1205//1205 1173//1173\nf 1183//1183 1198//1198 1084//1084\nf 1188//1188 1084//1084 1198//1198\nf 1214//1214 1184//1184 1182//1182\nf 1170//1170 1208//1208 1186//1186\nf 136//136 858//858 992//992\nf 1014//1014 1214//1214 1182//1182\nf 1190//1190 1184//1184 1214//1214\nf 1184//1184 1190//1190 1185//1185\nf 1170//1170 1185//1185 1208//1208\nf 1208//1208 1191//1191 1186//1186\nf 1181//1181 1390//1390 1289//1289\nf 1192//1192 1193//1193 1641//1641\nf 1641//1641 1193//1193 1091//1091\nf 1091//1091 1206//1206 1655//1655\nf 1655//1655 1206//1206 1183//1183\nf 1189//1189 1396//1396 1188//1188\nf 1127//1127 744//744 1734//1734\nf 789//789 860//860 926//926\nf 810//810 1235//1235 1172//1172\nf 1194//1194 1198//1198 1183//1183\nf 1190//1190 1200//1200 1185//1185\nf 1640//1640 1192//1192 1638//1638\nf 1640//1640 1213//1213 1192//1192\nf 1206//1206 1194//1194 1183//1183\nf 1199//1199 1188//1188 1198//1198\nf 1200//1200 1208//1208 1185//1185\nf 333//333 1054//1054 847//847\nf 1091//1091 1193//1193 1206//1206\nf 118//118 1189//1189 1188//1188\nf 436//436 1189//1189 118//118\nf 436//436 1207//1207 1189//1189\nf 1200//1200 1190//1190 1214//1214\nf 421//421 817//817 1054//1054\nf 1213//1213 1216//1216 1192//1192\nf 118//118 1188//1188 1199//1199\nf 46//46 1207//1207 436//436\nf 121//121 1133//1133 1134//1134\nf 875//875 1117//1117 1211//1211\nf 1192//1192 1216//1216 1193//1193\nf 1194//1194 1217//1217 1198//1198\nf 1217//1217 1199//1199 1198//1198\nf 1200//1200 1215//1215 1208//1208\nf 118//118 522//522 236//236\nf 1221//1221 1312//1312 1079//1079\nf 1221//1221 901//901 1312//1312\nf 1654//1654 1216//1216 1213//1213\nf 1193//1193 1226//1226 1206//1206\nf 1206//1206 1210//1210 1194//1194\nf 1210//1210 1217//1217 1194//1194\nf 1390//1390 1218//1218 1173//1173\nf 1208//1208 1215//1215 455//455\nf 172//172 558//558 1748//1748\nf 1806//1806 1079//1079 1788//1788\nf 1806//1806 1220//1220 1079//1079\nf 1199//1199 1217//1217 869//869\nf 667//667 911//911 855//855\nf 1231//1231 1232//1232 1214//1214\nf 1214//1214 1232//1232 1200//1200\nf 1200//1200 1232//1232 1215//1215\nf 1220//1220 1221//1221 1079//1079\nf 1216//1216 1222//1222 1193//1193\nf 1193//1193 1222//1222 1226//1226\nf 1226//1226 1229//1229 1206//1206\nf 1206//1206 1229//1229 1210//1210\nf 1210//1210 1229//1229 1217//1217\nf 1465//1465 1326//1326 1224//1224\nf 1216//1216 1228//1228 1222//1222\nf 1229//1229 1481//1481 1217//1217\nf 1227//1227 1654//1654 1377//1377\nf 1654//1654 1250//1250 1216//1216\nf 1222//1222 1241//1241 1226//1226\nf 1226//1226 1241//1241 1229//1229\nf 840//840 762//762 841//841\nf 1239//1239 1220//1220 1806//1806\nf 1239//1239 1221//1221 1220//1220\nf 1233//1233 1381//1381 1376//1376\nf 1227//1227 1250//1250 1654//1654\nf 1222//1222 1228//1228 1241//1241\nf 234//234 208//208 533//533\nf 111//111 1237//1237 1231//1231\nf 1249//1249 1232//1232 1231//1231\nf 1232//1232 455//455 1215//1215\nf 1250//1250 1228//1228 1216//1216\nf 1249//1249 1057//1057 1232//1232\nf 490//490 960//960 945//945\nf 449//449 1241//1241 285//285\nf 926//926 860//860 1243//1243\nf 1806//1806 1245//1245 1239//1239\nf 1253//1253 1221//1221 1239//1239\nf 1253//1253 922//922 1221//1221\nf 1237//1237 1252//1252 1231//1231\nf 1231//1231 1252//1252 1249//1249\nf 1057//1057 994//994 1232//1232\nf 1032//1032 1265//1265 1264//1264\nf 69//69 1187//1187 158//158\nf 1228//1228 1246//1246 1241//1241\nf 1104//1104 1246//1246 144//144\nf 1244//1244 1236//1236 613//613\nf 1253//1253 96//96 922//922\nf 1250//1250 1227//1227 1238//1238\nf 1391//1391 1388//1388 1255//1255\nf 1121//1121 385//385 831//831\nf 831//831 333//333 847//847\nf 1228//1228 144//144 1246//1246\nf 1316//1316 1370//1370 1359//1359\nf 1357//1357 1270//1270 1387//1387\nf 973//973 796//796 490//490\nf 1832//1832 1225//1225 311//311\nf 1251//1251 1256//1256 1252//1252\nf 1252//1252 1057//1057 1249//1249\nf 1257//1257 1244//1244 104//104\nf 659//659 359//359 176//176\nf 1621//1621 1239//1239 1245//1245\nf 1621//1621 1253//1253 1239//1239\nf 1507//1507 96//96 1253//1253\nf 105//105 1250//1250 1238//1238\nf 1250//1250 144//144 1228//1228\nf 1269//1269 1420//1420 1330//1330\nf 635//635 807//807 232//232\nf 619//619 832//832 816//816\nf 925//925 1243//1243 840//840\nf 1256//1256 1271//1271 1252//1252\nf 1252//1252 1271//1271 1057//1057\nf 867//867 926//926 1243//1243\nf 104//104 30//30 1257//1257\nf 425//425 1244//1244 1257//1257\nf 135//135 1652//1652 753//753\nf 1251//1251 918//918 1256//1256\nf 1173//1173 1205//1205 1261//1261\nf 1353//1353 1037//1037 1277//1277\nf 1266//1266 1202//1202 1330//1330\nf 805//805 1283//1283 1260//1260\nf 1260//1260 1295//1295 724//724\nf 336//336 1331//1331 1306//1306\nf 408//408 763//763 800//800\nf 876//876 857//857 1196//1196\nf 33//33 159//159 345//345\nf 968//968 945//945 750//750\nf 373//373 126//126 43//43\nf 1176//1176 1355//1355 1262//1262\nf 554//554 613//613 1236//1236\nf 1260//1260 1274//1274 1295//1295\nf 1295//1295 1284//1284 724//724\nf 758//758 79//79 159//159\nf 408//408 800//800 799//799\nf 902//902 52//52 53//53\nf 140//140 1387//1387 1390//1390\nf 1387//1387 1270//1270 1390//1390\nf 1390//1390 1270//1270 1218//1218\nf 1149//1149 1591//1591 1269//1269\nf 1429//1429 1450//1450 1451//1451\nf 805//805 1282//1282 1283//1283\nf 1274//1274 1260//1260 1283//1283\nf 159//159 400//400 780//780\nf 772//772 408//408 799//799\nf 522//522 1099//1099 236//236\nf 918//918 1313//1313 1256//1256\nf 1313//1313 1271//1271 1256//1256\nf 1218//1218 1270//1270 1394//1394\nf 1196//1196 1109//1109 635//635\nf 1111//1111 1107//1107 857//857\nf 1211//1211 1692//1692 1177//1177\nf 28//28 1113//1113 1146//1146\nf 1297//1297 28//28 1146//1146\nf 1172//1172 859//859 792//792\nf 705//705 1149//1149 1291//1291\nf 1431//1431 1437//1437 1438//1438\nf 1283//1283 1309//1309 1274//1274\nf 1301//1301 944//944 1284//1284\nf 1394//1394 1356//1356 1275//1275\nf 721//721 1279//1279 770//770\nf 1288//1288 1060//1060 1400//1400\nf 1311//1311 1389//1389 1273//1273\nf 1313//1313 1322//1322 1271//1271\nf 852//852 1186//1186 1191//1191\nf 1297//1297 1146//1146 1305//1305\nf 27//27 25//25 772//772\nf 52//52 911//911 632//632\nf 1330//1330 1291//1291 1269//1269\nf 1291//1291 1149//1149 1269//1269\nf 1299//1299 1294//1294 734//734\nf 1282//1282 1294//1294 1283//1283\nf 1283//1283 1294//1294 1309//1309\nf 1309//1309 1300//1300 1274//1274\nf 1301//1301 1284//1284 1295//1295\nf 1341//1341 944//944 1301//1301\nf 1341//1341 1302//1302 944//944\nf 408//408 755//755 763//763\nf 1288//1288 1400//1400 1296//1296\nf 35//35 140//140 129//129\nf 1289//1289 1173//1173 1261//1261\nf 121//121 1134//1134 1115//1115\nf 1307//1307 1114//1114 1512//1512\nf 1465//1465 1224//1224 1293//1293\nf 1300//1300 1295//1295 1274//1274\nf 1300//1300 1301//1301 1295//1295\nf 1287//1287 1296//1296 839//839\nf 1286//1286 1248//1248 1287//1287\nf 1248//1248 714//714 1287//1287\nf 1202//1202 1266//1266 1391//1391\nf 1379//1379 1369//1369 1358//1358\nf 1483//1483 1321//1321 918//918\nf 918//918 1321//1321 1313//1313\nf 851//851 1157//1157 1152//1152\nf 589//589 40//40 414//414\nf 1325//1325 1307//1307 687//687\nf 790//790 1366//1366 929//929\nf 1224//1224 1327//1327 1293//1293\nf 1293//1293 1327//1327 1299//1299\nf 870//870 1098//1098 1312//1312\nf 791//791 787//787 562//562\nf 1324//1324 1305//1305 933//933\nf 1324//1324 1297//1297 1305//1305\nf 1318//1318 1325//1325 687//687\nf 1307//1307 369//369 1114//1114\nf 1326//1326 1343//1343 1224//1224\nf 1327//1327 1349//1349 1299//1299\nf 1294//1294 1328//1328 1309//1309\nf 1309//1309 1319//1319 1300//1300\nf 705//705 1291//1291 1259//1259\nf 1321//1321 1322//1322 1313//1313\nf 762//762 121//121 1115//1115\nf 1685//1685 803//803 867//867\nf 1675//1675 7//7 1728//1728\nf 1317//1317 1324//1324 933//933\nf 1336//1336 1338//1338 1306//1306\nf 1349//1349 1328//1328 1294//1294\nf 1299//1299 1349//1349 1294//1294\nf 1334//1334 1301//1301 1300//1300\nf 1334//1334 1344//1344 1301//1301\nf 1329//1329 1302//1302 1341//1341\nf 1329//1329 1315//1315 1302//1302\nf 839//839 1400//1400 1320//1320\nf 922//922 1238//1238 901//901\nf 410//410 1392//1392 1409//1409\nf 1377//1377 1654//1654 678//678\nf 1282//1282 805//805 1459//1459\nf 1332//1332 1325//1325 1318//1318\nf 1325//1325 369//369 1307//1307\nf 369//369 1339//1339 1308//1308\nf 1328//1328 798//798 1309//1309\nf 798//798 1346//1346 1309//1309\nf 1309//1309 1346//1346 1319//1319\nf 1319//1319 1334//1334 1300//1300\nf 1342//1342 1148//1148 1573//1573\nf 924//924 1322//1322 1321//1321\nf 924//924 921//921 1322//1322\nf 40//40 589//589 867//867\nf 1142//1142 1324//1324 1317//1317\nf 1331//1331 1336//1336 1306//1306\nf 1338//1338 1336//1336 1337//1337\nf 1340//1340 1333//1333 1326//1326\nf 1224//1224 1343//1343 1327//1327\nf 1343//1343 1349//1349 1327//1327\nf 1349//1349 798//798 1328//1328\nf 1346//1346 1334//1334 1319//1319\nf 1344//1344 1341//1341 1301//1301\nf 1420//1420 1266//1266 1330//1330\nf 1348//1348 1321//1321 1585//1585\nf 1536//1536 1142//1142 1317//1317\nf 1079//1079 1312//1312 583//583\nf 1345//1345 1336//1336 1331//1331\nf 754//754 1332//1332 1338//1338\nf 369//369 1325//1325 1332//1332\nf 754//754 369//369 1332//1332\nf 1333//1333 1486//1486 1326//1326\nf 1326//1326 1486//1486 1343//1343\nf 788//788 1344//1344 1334//1334\nf 138//138 1329//1329 1341//1341\nf 974//974 1342//1342 1480//1480\nf 407//407 1148//1148 1342//1342\nf 1172//1172 1235//1235 859//859\nf 1142//1142 1536//1536 1323//1323\nf 50//50 1142//1142 1323//1323\nf 1345//1345 1337//1337 1336//1336\nf 974//974 909//909 1342//1342\nf 767//767 1348//1348 1585//1585\nf 1348//1348 924//924 1321//1321\nf 782//782 50//50 1323//1323\nf 369//369 233//233 1339//1339\nf 788//788 1341//1341 1344//1344\nf 788//788 138//138 1341//1341\nf 569//569 1347//1347 974//974\nf 59//59 1148//1148 407//407\nf 443//443 1335//1335 1148//1148\nf 59//59 443//443 1148//1148\nf 443//443 767//767 1335//1335\nf 91//91 924//924 1348//1348\nf 429//429 369//369 754//754\nf 780//780 1334//1334 1346//1346\nf 826//826 788//788 1334//1334\nf 138//138 1350//1350 1329//1329\nf 1329//1329 1347//1347 569//569\nf 909//909 407//407 1342//1342\nf 925//925 867//867 1243//1243\nf 1337//1337 754//754 1338//1338\nf 429//429 233//233 369//369\nf 1116//1116 778//778 1099//1099\nf 1349//1349 29//29 798//798\nf 798//798 780//780 1346//1346\nf 780//780 826//826 1334//1334\nf 1008//1008 909//909 974//974\nf 584//584 1352//1352 881//881\nf 1366//1366 1247//1247 978//978\nf 1659//1659 146//146 1711//1711\nf 1311//1311 797//797 1389//1389\nf 719//719 246//246 166//166\nf 1303//1303 1273//1273 1255//1255\nf 1175//1175 1352//1352 584//584\nf 1175//1175 716//716 1352//1352\nf 1359//1359 1261//1261 1205//1205\nf 1375//1375 1374//1374 1277//1277\nf 1378//1378 1375//1375 1277//1277\nf 679//679 1363//1363 1383//1383\nf 1378//1378 1277//1277 255//255\nf 140//140 35//35 41//41\nf 1009//1009 1175//1175 584//584\nf 1397//1397 1287//1287 1320//1320\nf 769//769 892//892 458//458\nf 1317//1317 933//933 1536//1536\nf 1290//1290 1372//1372 1361//1361\nf 183//183 737//737 865//865\nf 1356//1356 1365//1365 1275//1275\nf 861//861 1368//1368 1355//1355\nf 1363//1363 1223//1223 1383//1383\nf 1377//1377 870//870 1312//1312\nf 1591//1591 1412//1412 199//199\nf 1233//1233 1376//1376 878//878\nf 1395//1395 1296//1296 1287//1287\nf 881//881 1357//1357 1387//1387\nf 881//881 1352//1352 1357//1357\nf 1212//1212 1060//1060 1288//1288\nf 198//198 679//679 1406//1406\nf 881//881 1387//1387 1004//1004\nf 1369//1369 1254//1254 1358//1358\nf 1358//1358 1254//1254 1037//1037\nf 716//716 1290//1290 1365//1365\nf 1355//1355 1368//1368 704//704\nf 1384//1384 878//878 1376//1376\nf 1267//1267 1289//1289 1261//1261\nf 1374//1374 1375//1375 704//704\nf 1373//1373 1290//1290 1175//1175\nf 1304//1304 1367//1367 1379//1379\nf 1352//1352 716//716 1356//1356\nf 1666//1666 1667//1667 625//625\nf 1310//1310 1358//1358 1037//1037\nf 901//901 1238//1238 1227//1227\nf 1175//1175 1290//1290 716//716\nf 1338//1338 1332//1332 1318//1318\nf 1361//1361 1304//1304 1360//1360\nf 1268//1268 1355//1355 1176//1176\nf 1242//1242 1285//1285 1415//1415\nf 1378//1378 255//255 930//930\nf 1386//1386 856//856 837//837\nf 1397//1397 1320//1320 1437//1437\nf 1362//1362 1367//1367 1304//1304\nf 1382//1382 1369//1369 1379//1379\nf 1314//1314 1212//1212 1392//1392\nf 1369//1369 1386//1386 1364//1364\nf 814//814 83//83 862//862\nf 1059//1059 1281//1281 808//808\nf 894//894 520//520 893//893\nf 1360//1360 1304//1304 861//861\nf 1383//1383 1351//1351 1248//1248\nf 1372//1372 1304//1304 1361//1361\nf 1268//1268 1176//1176 1272//1272\nf 770//770 1287//1287 1397//1397\nf 713//713 1838//1838 83//83\nf 1367//1367 1386//1386 1382//1382\nf 1366//1366 797//797 1311//1311\nf 1004//1004 1387//1387 41//41\nf 781//781 1372//1372 1371//1371\nf 562//562 863//863 791//791\nf 1285//1285 1381//1381 865//865\nf 1450//1450 1429//1429 178//178\nf 612//612 1281//1281 1059//1059\nf 1285//1285 1376//1376 1381//1381\nf 927//927 507//507 1242//1242\nf 1306//1306 1338//1338 1318//1318\nf 310//310 1204//1204 209//209\nf 1389//1389 1202//1202 1391//1391\nf 1310//1310 1037//1037 1353//1353\nf 1378//1378 930//930 1412//1412\nf 1400//1400 1060//1060 1258//1258\nf 1113//1113 71//71 1146//1146\nf 290//290 1167//1167 562//562\nf 1289//1289 1390//1390 1173//1173\nf 1363//1363 38//38 1181//1181\nf 714//714 1395//1395 1287//1287\nf 1356//1356 1394//1394 1270//1270\nf 1402//1402 1424//1424 942//942\nf 1275//1275 1272//1272 1385//1385\nf 861//861 1379//1379 1368//1368\nf 716//716 1365//1365 1356//1356\nf 678//678 1407//1407 870//870\nf 1298//1298 1359//1359 1203//1203\nf 1389//1389 1259//1259 1330//1330\nf 1181//1181 1289//1289 1267//1267\nf 1009//1009 584//584 881//881\nf 1525//1525 1426//1426 1464//1464\nf 1391//1391 1404//1404 1388//1388\nf 1279//1279 1380//1380 1248//1248\nf 1279//1279 1248//1248 1286//1286\nf 965//965 1279//1279 1263//1263\nf 1359//1359 1370//1370 1203//1203\nf 1716//1716 1700//1700 1727//1727\nf 927//927 1242//1242 1415//1415\nf 1342//1342 1573//1573 1480//1480\nf 927//927 931//931 917//917\nf 1398//1398 52//52 782//782\nf 410//410 1359//1359 1298//1298\nf 1237//1237 437//437 302//302\nf 1377//1377 678//678 870//870\nf 1352//1352 1356//1356 1357//1357\nf 759//759 1535//1535 1524//1524\nf 1379//1379 1358//1358 1368//1368\nf 978//978 1212//1212 1366//1366\nf 1136//1136 1137//1137 855//855\nf 1395//1395 1392//1392 1296//1296\nf 1267//1267 1261//1261 1223//1223\nf 1366//1366 1303//1303 1247//1247\nf 1233//1233 878//878 845//845\nf 737//737 931//931 865//865\nf 1409//1409 1359//1359 410//410\nf 1509//1509 818//818 1524//1524\nf 1382//1382 1386//1386 1369//1369\nf 719//719 855//855 911//911\nf 855//855 719//719 1136//1136\nf 1383//1383 1223//1223 1351//1351\nf 1392//1392 1212//1212 1288//1288\nf 1392//1392 1288//1288 1296//1296\nf 1258//1258 1652//1652 135//135\nf 1415//1415 1285//1285 865//865\nf 1292//1292 1370//1370 1316//1316\nf 1203//1203 929//929 1314//1314\nf 87//87 1401//1401 1414//1414\nf 1414//1414 1201//1201 87//87\nf 1264//1264 1626//1626 1032//1032\nf 1414//1414 1401//1401 1405//1405\nf 1003//1003 1665//1665 1835//1835\nf 931//931 927//927 1415//1415\nf 1400//1400 1258//1258 135//135\nf 521//521 317//317 597//597\nf 1394//1394 1275//1275 1209//1209\nf 1658//1658 1656//1656 1713//1713\nf 1408//1408 1405//1405 1401//1401\nf 1405//1405 1411//1411 1414//1414\nf 1650//1650 1230//1230 1407//1407\nf 1363//1363 1267//1267 1223//1223\nf 1385//1385 1272//1272 1176//1176\nf 901//901 1377//1377 1312//1312\nf 1275//1275 1385//1385 1292//1292\nf 1292//1292 1385//1385 1432//1432\nf 1434//1434 1397//1397 1437//1437\nf 1268//1268 1360//1360 1355//1355\nf 310//310 1354//1354 704//704\nf 839//839 1320//1320 1287//1287\nf 1408//1408 1411//1411 1405//1405\nf 442//442 1519//1519 774//774\nf 1242//1242 124//124 1429//1429\nf 1623//1623 1522//1522 1225//1225\nf 1218//1218 1209//1209 1173//1173\nf 1131//1131 794//794 1077//1077\nf 426//426 1410//1410 1482//1482\nf 1482//1482 1410//1410 1534//1534\nf 1304//1304 1379//1379 861//861\nf 1351//1351 1409//1409 1395//1395\nf 1247//1247 1652//1652 978//978\nf 1290//1290 1361//1361 1365//1365\nf 1728//1728 1695//1695 1624//1624\nf 1418//1418 1408//1408 1534//1534\nf 1418//1418 1411//1411 1408//1408\nf 1407//1407 1651//1651 1650//1650\nf 1320//1320 135//135 1438//1438\nf 1415//1415 865//865 931//931\nf 1407//1407 1230//1230 1125//1125\nf 1355//1355 1360//1360 861//861\nf 1434//1434 770//770 1397//1397\nf 1418//1418 1534//1534 1410//1410\nf 1417//1417 1414//1414 1411//1411\nf 1416//1416 1417//1417 1411//1411\nf 96//96 1238//1238 922//922\nf 1393//1393 1255//1255 1396//1396\nf 1361//1361 1360//1360 1268//1268\nf 1259//1259 1291//1291 1330//1330\nf 1181//1181 129//129 1390//1390\nf 1421//1421 1410//1410 426//426\nf 1418//1418 1419//1419 1411//1411\nf 1419//1419 1416//1416 1411//1411\nf 1423//1423 1078//1078 1417//1417\nf 1248//1248 1351//1351 1395//1395\nf 38//38 44//44 1181//1181\nf 1205//1205 1316//1316 1359//1359\nf 1429//1429 1384//1384 1376//1376\nf 1357//1357 1356//1356 1270//1270\nf 1410//1410 1419//1419 1418//1418\nf 1303//1303 46//46 1247//1247\nf 1422//1422 1417//1417 1416//1416\nf 1422//1422 1423//1423 1417//1417\nf 1423//1423 1495//1495 1078//1078\nf 958//958 721//721 939//939\nf 1424//1424 1410//1410 1421//1421\nf 1424//1424 1419//1419 1410//1410\nf 753//753 435//435 1439//1439\nf 1261//1261 1359//1359 1409//1409\nf 1364//1364 1386//1386 786//786\nf 1424//1424 1427//1427 1419//1419\nf 1427//1427 1425//1425 1419//1419\nf 1230//1230 1650//1650 1125//1125\nf 1223//1223 1261//1261 1351//1351\nf 1509//1509 1524//1524 1138//1138\nf 1279//1279 1286//1286 770//770\nf 1483//1483 918//918 145//145\nf 1419//1419 1425//1425 1416//1416\nf 1426//1426 1423//1423 1422//1422\nf 1426//1426 1525//1525 1423//1423\nf 1273//1273 1389//1389 1391//1391\nf 1392//1392 410//410 1314//1314\nf 1379//1379 1367//1367 1382//1382\nf 1372//1372 484//484 1362//1362\nf 721//721 1263//1263 1279//1279\nf 30//30 104//104 160//160\nf 1272//1272 1365//1365 1268//1268\nf 1425//1425 1428//1428 1416//1416\nf 1538//1538 1523//1523 1519//1519\nf 135//135 753//753 1439//1439\nf 1421//1421 935//935 942//942\nf 1429//1429 1376//1376 1285//1285\nf 1278//1278 1225//1225 1832//1832\nf 1363//1363 1181//1181 1267//1267\nf 1402//1402 1427//1427 1424//1424\nf 1578//1578 1370//1370 1292//1292\nf 269//269 484//484 263//263\nf 1384//1384 1451//1451 1457//1457\nf 1385//1385 1176//1176 1432//1432\nf 1431//1431 1416//1416 1428//1428\nf 1431//1431 1422//1422 1416//1416\nf 1431//1431 1426//1426 1422//1422\nf 1380//1380 1383//1383 1248//1248\nf 1253//1253 1554//1554 1430//1430\nf 1207//1207 1393//1393 1396//1396\nf 1434//1434 1431//1431 1428//1428\nf 310//310 209//209 1354//1354\nf 1273//1273 1391//1391 1255//1255\nf 1362//1362 484//484 1367//1367\nf 1524//1524 818//818 809//809\nf 1303//1303 1255//1255 1393//1393\nf 1372//1372 1362//1362 1304//1304\nf 1427//1427 1436//1436 1425//1425\nf 1436//1436 1434//1434 1425//1425\nf 1434//1434 1428//1428 1425//1425\nf 721//721 770//770 1434//1434\nf 797//797 1259//1259 1389//1389\nf 1591//1591 1420//1420 1269//1269\nf 1290//1290 1373//1373 1372//1372\nf 1306//1306 1318//1318 1510//1510\nf 999//999 1373//1373 1175//1175\nf 41//41 1387//1387 140//140\nf 1262//1262 1355//1355 704//704\nf 1365//1365 1272//1272 1275//1275\nf 135//135 1439//1439 1438//1438\nf 1437//1437 1320//1320 1438//1438\nf 1318//1318 687//687 1510//1510\nf 1485//1485 933//933 1305//1305\nf 1435//1435 1433//1433 1510//1510\nf 1421//1421 66//66 935//935\nf 932//932 931//931 737//737\nf 1368//1368 1358//1358 1310//1310\nf 1373//1373 1371//1371 1372//1372\nf 1205//1205 1209//1209 1316//1316\nf 1427//1427 939//939 1436//1436\nf 1369//1369 1364//1364 1254//1254\nf 1208//1208 455//455 1191//1191\nf 1303//1303 1311//1311 1273//1273\nf 310//310 1378//1378 391//391\nf 391//391 1378//1378 1412//1412\nf 1371//1371 1373//1373 999//999\nf 1412//1412 1591//1591 1149//1149\nf 721//721 1434//1434 1436//1436\nf 1451//1451 1384//1384 1429//1429\nf 1380//1380 679//679 1383//1383\nf 1406//1406 679//679 1380//1380\nf 1209//1209 1292//1292 1316//1316\nf 1400//1400 135//135 1320//1320\nf 1368//1368 1310//1310 1374//1374\nf 1374//1374 1353//1353 1277//1277\nf 597//597 742//742 594//594\nf 554//554 1265//1265 613//613\nf 1434//1434 1437//1437 1431//1431\nf 1438//1438 1439//1439 1431//1431\nf 965//965 1406//1406 1380//1380\nf 1374//1374 1310//1310 1353//1353\nf 1266//1266 1404//1404 1391//1391\nf 1234//1234 1619//1619 1435//1435\nf 1366//1366 1311//1311 1303//1303\nf 790//790 797//797 1366//1366\nf 721//721 1436//1436 939//939\nf 129//129 140//140 1390//1390\nf 1467//1467 934//934 1526//1526\nf 1192//1192 1641//1641 1638//1638\nf 1315//1315 1443//1443 944//944\nf 1142//1142 354//354 1324//1324\nf 1490//1490 1139//1139 1475//1475\nf 1463//1463 1478//1478 1441//1441\nf 1475//1475 1139//1139 1489//1489\nf 1443//1443 1315//1315 1444//1444\nf 1447//1447 1031//1031 1547//1547\nf 1485//1485 1146//1146 698//698\nf 1550//1550 1444//1444 1446//1446\nf 1471//1471 1573//1573 1469//1469\nf 1398//1398 1240//1240 1508//1508\nf 1650//1650 1826//1826 1825//1825\nf 1260//1260 1441//1441 1478//1478\nf 1452//1452 1451//1451 1450//1450\nf 979//979 1447//1447 653//653\nf 1455//1455 1457//1457 1452//1452\nf 1452//1452 1457//1457 1451//1451\nf 342//342 1508//1508 596//596\nf 934//934 1548//1548 80//80\nf 805//805 1453//1453 1061//1061\nf 1455//1455 1456//1456 1457//1457\nf 1399//1399 1461//1461 1455//1455\nf 1456//1456 878//878 1457//1457\nf 1278//1278 1832//1832 1826//1826\nf 805//805 1061//1061 1459//1459\nf 1340//1340 1460//1460 1596//1596\nf 1315//1315 1105//1105 1444//1444\nf 934//934 1449//1449 1548//1548\nf 148//148 1461//1461 1399//1399\nf 1461//1461 1462//1462 1455//1455\nf 1455//1455 1462//1462 1456//1456\nf 1293//1293 1126//1126 1465//1465\nf 418//418 1532//1532 1481//1481\nf 1460//1460 1340//1340 1326//1326\nf 812//812 1757//1757 336//336\nf 1513//1513 937//937 1491//1491\nf 778//778 1530//1530 1099//1099\nf 148//148 1476//1476 1461//1461\nf 1465//1465 254//254 1460//1460\nf 837//837 856//856 483//483\nf 1488//1488 1487//1487 1308//1308\nf 1105//1105 1502//1502 1444//1444\nf 1440//1440 1201//1201 1533//1533\nf 1476//1476 1470//1470 1461//1461\nf 1461//1461 1470//1470 1462//1462\nf 1326//1326 1465//1465 1460//1460\nf 1278//1278 1826//1826 1650//1650\nf 1533//1533 1201//1201 1078//1078\nf 845//845 878//878 1456//1456\nf 1573//1573 934//934 1467//1467\nf 1480//1480 569//569 974//974\nf 1510//1510 336//336 1306//1306\nf 1340//1340 1596//1596 1760//1760\nf 1470//1470 1477//1477 1462//1462\nf 1462//1462 1477//1477 1456//1456\nf 1105//1105 1471//1471 1469//1469\nf 1465//1465 1473//1473 254//254\nf 1118//1118 1092//1092 1408//1408\nf 1757//1757 1543//1543 336//336\nf 1207//1207 1396//1396 1189//1189\nf 336//336 1543//1543 1331//1331\nf 836//836 845//845 1456//1456\nf 1472//1472 1599//1599 1463//1463\nf 1492//1492 1443//1443 1442//1442\nf 836//836 1456//1456 1477//1477\nf 1442//1442 1443//1443 1444//1444\nf 1490//1490 1475//1475 1474//1474\nf 1252//1252 1237//1237 1251//1251\nf 1031//1031 1453//1453 1478//1478\nf 1599//1599 1440//1440 1533//1533\nf 979//979 1599//1599 1493//1493\nf 1427//1427 1402//1402 939//939\nf 1449//1449 1585//1585 1483//1483\nf 1725//1725 1498//1498 1476//1476\nf 1476//1476 1498//1498 1470//1470\nf 1485//1485 1536//1536 933//933\nf 1308//1308 1487//1487 1114//1114\nf 1488//1488 697//697 1496//1496\nf 1038//1038 1492//1492 1442//1442\nf 1031//1031 1447//1447 937//937\nf 1454//1454 1488//1488 1496//1496\nf 697//697 1468//1468 1496//1496\nf 1139//1139 1490//1490 1484//1484\nf 1498//1498 1144//1144 1470//1470\nf 1470//1470 1144//1144 1477//1477\nf 653//653 1599//1599 979//979\nf 851//851 1044//1044 1151//1151\nf 1483//1483 1585//1585 1321//1321\nf 1732//1732 99//99 1698//1698\nf 1114//1114 1555//1555 1574//1574\nf 1525//1525 1533//1533 1495//1495\nf 1497//1497 1468//1468 697//697\nf 1453//1453 1260//1260 1478//1478\nf 297//297 1505//1505 1498//1498\nf 1505//1505 1144//1144 1498//1498\nf 1144//1144 1500//1500 1477//1477\nf 719//719 911//911 1499//1499\nf 869//869 1541//1541 1529//1529\nf 818//818 1254//1254 811//811\nf 1491//1491 697//697 1488//1488\nf 1441//1441 1492//1492 1038//1038\nf 1511//1511 677//677 596//596\nf 1489//1489 1493//1493 1518//1518\nf 782//782 1240//1240 1398//1398\nf 1468//1468 1520//1520 1504//1504\nf 1501//1501 1308//1308 1760//1760\nf 1150//1150 398//398 453//453\nf 1505//1505 1515//1515 1144//1144\nf 1515//1515 843//843 1144//1144\nf 1126//1126 734//734 1459//1459\nf 1504//1504 1532//1532 1556//1556\nf 1277//1277 1037//1037 1138//1138\nf 1441//1441 724//724 1124//1124\nf 1037//1037 1509//1509 1138//1138\nf 818//818 1509//1509 1254//1254\nf 104//104 884//884 1113//1113\nf 1459//1459 732//732 1473//1473\nf 1513//1513 1491//1491 1488//1488\nf 1488//1488 1454//1454 1487//1487\nf 1139//1139 979//979 1489//1489\nf 1037//1037 1254//1254 1509//1509\nf 1399//1399 150//150 148//148\nf 1475//1475 1518//1518 1514//1514\nf 1126//1126 1459//1459 1473//1473\nf 1487//1487 1454//1454 1555//1555\nf 1519//1519 1535//1535 759//759\nf 346//346 1059//1059 1063//1063\nf 929//929 1203//1203 1370//1370\nf 1555//1555 1542//1542 1506//1506\nf 1465//1465 1126//1126 1473//1473\nf 1505//1505 765//765 1515//1515\nf 305//305 427//427 574//574\nf 1506//1506 743//743 1507//1507\nf 1480//1480 1573//1573 1479//1479\nf 1520//1520 1484//1484 1490//1490\nf 834//834 717//717 1070//1070\nf 1523//1523 1535//1535 1519//1519\nf 1116//1116 1514//1514 778//778\nf 812//812 336//336 1433//1433\nf 1592//1592 1534//1534 1408//1408\nf 778//778 1518//1518 1530//1530\nf 1514//1514 1518//1518 778//778\nf 1499//1499 911//911 1398//1398\nf 1070//1070 1540//1540 834//834\nf 834//834 1540//1540 1538//1538\nf 1523//1523 1552//1552 1535//1535\nf 1535//1535 1552//1552 1524//1524\nf 1539//1539 1138//1138 1524//1524\nf 911//911 52//52 1398//1398\nf 1368//1368 1374//1374 704//704\nf 1467//1467 1526//1526 1469//1469\nf 158//158 1187//1187 1833//1833\nf 1430//1430 1512//1512 1507//1507\nf 1574//1574 1506//1506 1507//1507\nf 1260//1260 1453//1453 805//805\nf 1504//1504 1496//1496 1468//1468\nf 263//263 484//484 781//781\nf 1573//1573 1467//1467 1469//1469\nf 1537//1537 1557//1557 717//717\nf 717//717 1557//1557 1070//1070\nf 1545//1545 1524//1524 1552//1552\nf 1545//1545 1539//1539 1524//1524\nf 1512//1512 1574//1574 1507//1507\nf 934//934 1573//1573 1449//1449\nf 1544//1544 1538//1538 1540//1540\nf 1538//1538 1544//1544 1523//1523\nf 1092//1092 934//934 80//80\nf 1520//1520 1541//1541 1546//1546\nf 1550//1550 1446//1446 87//87\nf 1070//1070 1549//1549 1540//1540\nf 1549//1549 1544//1544 1540//1540\nf 1544//1544 1552//1552 1523//1523\nf 1501//1501 1488//1488 1308//1308\nf 69//69 785//785 1187//1187\nf 1553//1553 1545//1545 1552//1552\nf 1551//1551 1539//1539 1545//1545\nf 1539//1539 1551//1551 1138//1138\nf 1520//1520 1474//1474 1541//1541\nf 1548//1548 1449//1449 1483//1483\nf 1561//1561 1564//1564 1537//1537\nf 1537//1537 1564//1564 1557//1557\nf 1557//1557 1549//1549 1070//1070\nf 1544//1544 1559//1559 1552//1552\nf 1138//1138 1551//1551 1277//1277\nf 1454//1454 1496//1496 1556//1556\nf 1562//1562 1544//1544 1549//1549\nf 1544//1544 1562//1562 1559//1559\nf 1559//1559 1567//1567 1552//1552\nf 1553//1553 1551//1551 1545//1545\nf 1570//1570 1558//1558 1551//1551\nf 1558//1558 1277//1277 1551//1551\nf 1277//1277 1558//1558 255//255\nf 1532//1532 1504//1504 1481//1481\nf 1536//1536 1531//1531 1511//1511\nf 1546//1546 1504//1504 1520//1520\nf 1548//1548 1483//1483 80//80\nf 1567//1567 1553//1553 1552//1552\nf 1553//1553 1570//1570 1551//1551\nf 1504//1504 1546//1546 1481//1481\nf 704//704 1378//1378 310//310\nf 1626//1626 676//676 757//757\nf 1038//1038 1442//1442 89//89\nf 930//930 255//255 1558//1558\nf 850//850 1568//1568 1561//1561\nf 1557//1557 1565//1565 1549//1549\nf 1493//1493 1530//1530 1518//1518\nf 1253//1253 1430//1430 1507//1507\nf 1554//1554 1028//1028 1430//1430\nf 1454//1454 1556//1556 1542//1542\nf 1555//1555 1454//1454 1542//1542\nf 1234//1234 687//687 1554//1554\nf 1329//1329 1105//1105 1315//1315\nf 1565//1565 1577//1577 1549//1549\nf 1549//1549 1577//1577 1562//1562\nf 1558//1558 1563//1563 930//930\nf 1521//1521 113//113 1669//1669\nf 1484//1484 1447//1447 1139//1139\nf 779//779 1571//1571 1568//1568\nf 1564//1564 1565//1565 1557//1557\nf 1562//1562 1566//1566 1559//1559\nf 1566//1566 1567//1567 1559//1559\nf 1570//1570 1553//1553 1567//1567\nf 1563//1563 1558//1558 1570//1570\nf 1531//1531 1536//1536 1485//1485\nf 1388//1388 1403//1403 1396//1396\nf 1622//1622 1635//1635 1388//1388\nf 1568//1568 1569//1569 1561//1561\nf 1561//1561 1569//1569 1564//1564\nf 1572//1572 1570//1570 1567//1567\nf 1345//1345 1331//1331 1543//1543\nf 1578//1578 1432//1432 1354//1354\nf 1639//1639 234//234 305//305\nf 1525//1525 1464//1464 1530//1530\nf 1354//1354 1432//1432 1176//1176\nf 1078//1078 1201//1201 1414//1414\nf 1479//1479 1471//1471 1105//1105\nf 1569//1569 1576//1576 1564//1564\nf 1564//1564 1576//1576 1565//1565\nf 1576//1576 1577//1577 1565//1565\nf 1562//1562 1577//1577 1566//1566\nf 1566//1566 1575//1575 1567//1567\nf 1563//1563 1516//1516 930//930\nf 1556//1556 97//97 1542//1542\nf 1532//1532 418//418 97//97\nf 1556//1556 1532//1532 97//97\nf 1247//1247 46//46 1652//1652\nf 209//209 1578//1578 1354//1354\nf 1587//1587 1569//1569 1568//1568\nf 1575//1575 1572//1572 1567//1567\nf 1572//1572 1584//1584 1570//1570\nf 1475//1475 1514//1514 1529//1529\nf 1240//1240 1323//1323 1536//1536\nf 1479//1479 1573//1573 1471//1471\nf 1571//1571 1587//1587 1568//1568\nf 1489//1489 1518//1518 1475//1475\nf 9//9 1834//1834 1838//1838\nf 1124//1124 1443//1443 1492//1492\nf 1590//1590 1569//1569 1587//1587\nf 1577//1577 1595//1595 1566//1566\nf 1566//1566 1595//1595 1575//1575\nf 1563//1563 199//199 1516//1516\nf 1560//1560 1442//1442 1550//1550\nf 1442//1442 1444//1444 1550//1550\nf 1136//1136 426//426 1482//1482\nf 1240//1240 1536//1536 1508//1508\nf 1596//1596 1488//1488 1501//1501\nf 1571//1571 1586//1586 1587//1587\nf 1590//1590 1579//1579 1569//1569\nf 1569//1569 1579//1579 1576//1576\nf 1580//1580 1570//1570 1584//1584\nf 1178//1178 1578//1578 209//209\nf 116//116 1237//1237 111//111\nf 1579//1579 1594//1594 1576//1576\nf 1588//1588 1577//1577 1576//1576\nf 1577//1577 1582//1582 1595//1595\nf 1572//1572 1583//1583 1584//1584\nf 1589//1589 1580//1580 1584//1584\nf 1580//1580 1581//1581 1563//1563\nf 1570//1570 1580//1580 1563//1563\nf 1563//1563 1581//1581 199//199\nf 1028//1028 1512//1512 1430//1430\nf 1590//1590 1594//1594 1579//1579\nf 1588//1588 1582//1582 1577//1577\nf 1583//1583 1575//1575 1595//1595\nf 1575//1575 1583//1583 1572//1572\nf 1576//1576 1594//1594 1588//1588\nf 1584//1584 1583//1583 1589//1589\nf 1581//1581 1591//1591 199//199\nf 1588//1588 1594//1594 1582//1582\nf 1506//1506 1542//1542 97//97\nf 1370//1370 1578//1578 1178//1178\nf 1574//1574 1555//1555 1506//1506\nf 1480//1480 1479//1479 569//569\nf 1586//1586 1590//1590 1587//1587\nf 1370//1370 1178//1178 705//705\nf 767//767 1585//1585 1335//1335\nf 978//978 1258//1258 1060//1060\nf 1092//1092 1592//1592 1408//1408\nf 1592//1592 1092//1092 1458//1458\nf 1586//1586 1605//1605 1590//1590\nf 1582//1582 1593//1593 1595//1595\nf 1603//1603 1583//1583 1595//1595\nf 1583//1583 1609//1609 1589//1589\nf 1609//1609 1580//1580 1589//1589\nf 1580//1580 1598//1598 1581//1581\nf 1420//1420 1591//1591 1581//1581\nf 1598//1598 1420//1420 1581//1581\nf 1432//1432 1578//1578 1292//1292\nf 1590//1590 1605//1605 1594//1594\nf 1602//1602 1597//1597 1594//1594\nf 1594//1594 1597//1597 1582//1582\nf 1307//1307 1512//1512 1028//1028\nf 1512//1512 1114//1114 1574//1574\nf 1787//1787 1413//1413 1586//1586\nf 1413//1413 1605//1605 1586//1586\nf 1582//1582 1597//1597 1593//1593\nf 1593//1593 1603//1603 1595//1595\nf 1609//1609 1600//1600 1580//1580\nf 1600//1600 1612//1612 1580//1580\nf 1580//1580 1612//1612 1598//1598\nf 1513//1513 1488//1488 254//254\nf 1520//1520 1490//1490 1474//1474\nf 1546//1546 1541//1541 869//869\nf 1084//1084 1188//1188 1403//1403\nf 1118//1118 1408//1408 1401//1401\nf 1293//1293 734//734 1126//1126\nf 285//285 1241//1241 1246//1246\nf 1605//1605 1601//1601 1594//1594\nf 1601//1601 1602//1602 1594//1594\nf 1583//1583 1608//1608 1609//1609\nf 790//790 1370//1370 705//705\nf 1468//1468 1484//1484 1520//1520\nf 1602//1602 1614//1614 1597//1597\nf 1597//1597 1614//1614 1593//1593\nf 1603//1603 1608//1608 1583//1583\nf 1621//1621 1554//1554 1253//1253\nf 1602//1602 1606//1606 1614//1614\nf 1593//1593 1614//1614 1603//1603\nf 1603//1603 1607//1607 1608//1608\nf 1609//1609 1610//1610 1600//1600\nf 1600//1600 1610//1610 1612//1612\nf 1604//1604 1598//1598 1612//1612\nf 1266//1266 1420//1420 1598//1598\nf 1604//1604 1266//1266 1598//1598\nf 1393//1393 1207//1207 46//46\nf 929//929 1370//1370 790//790\nf 1475//1475 1529//1529 1474//1474\nf 1105//1105 1469//1469 1502//1502\nf 1413//1413 1522//1522 1605//1605\nf 1614//1614 1632//1632 1603//1603\nf 1608//1608 1611//1611 1609//1609\nf 1609//1609 1611//1611 1610//1610\nf 1477//1477 864//864 836//836\nf 1496//1496 1504//1504 1556//1556\nf 1499//1499 1398//1398 719//719\nf 1521//1521 1669//1669 8//8\nf 1605//1605 1616//1616 1601//1601\nf 1606//1606 1602//1602 1601//1601\nf 1603//1603 1632//1632 1607//1607\nf 1607//1607 1611//1611 1608//1608\nf 1760//1760 1596//1596 1501//1501\nf 1293//1293 1299//1299 734//734\nf 1616//1616 1605//1605 1522//1522\nf 1610//1610 1604//1604 1612//1612\nf 653//653 1463//1463 1599//1599\nf 1469//1469 1526//1526 1446//1446\nf 1444//1444 1502//1502 1446//1446\nf 1135//1135 1724//1724 151//151\nf 1522//1522 1623//1623 1616//1616\nf 1616//1616 1617//1617 1601//1601\nf 1617//1617 1606//1606 1601//1601\nf 1606//1606 1617//1617 1613//1613\nf 1606//1606 1613//1613 1614//1614\nf 1613//1613 1618//1618 1614//1614\nf 1614//1614 1618//1618 1632//1632\nf 1607//1607 1615//1615 1611//1611\nf 1266//1266 1604//1604 1404//1404\nf 449//449 418//418 1481//1481\nf 1596//1596 254//254 1488//1488\nf 1502//1502 1469//1469 1446//1446\nf 1384//1384 1457//1457 878//878\nf 1491//1491 1497//1497 697//697\nf 1611//1611 1628//1628 1610//1610\nf 1628//1628 1622//1622 1610//1610\nf 1592//1592 1482//1482 1534//1534\nf 1599//1599 1472//1472 1440//1440\nf 1354//1354 1262//1262 704//704\nf 1607//1607 1632//1632 1615//1615\nf 1610//1610 1622//1622 1404//1404\nf 1533//1533 1078//1078 1495//1495\nf 1529//1529 1116//1116 514//514\nf 1547//1547 653//653 1447//1447\nf 1212//1212 929//929 1366//1366\nf 1541//1541 1474//1474 1529//1529\nf 1079//1079 1503//1503 1788//1788\nf 1426//1426 1431//1431 1439//1439\nf 1618//1618 1631//1631 1632//1632\nf 960//960 750//750 945//945\nf 567//567 571//571 604//604\nf 1717//1717 311//311 1522//1522\nf 776//776 453//453 398//398\nf 1616//1616 1637//1637 1617//1617\nf 1617//1617 1637//1637 1613//1613\nf 1611//1611 1633//1633 1628//1628\nf 790//790 705//705 1259//1259\nf 1458//1458 1482//1482 1592//1592\nf 1770//1770 1757//1757 812//812\nf 208//208 1630//1630 723//723\nf 1630//1630 1626//1626 723//723\nf 1225//1225 1278//1278 1623//1623\nf 1623//1623 1637//1637 1616//1616\nf 1637//1637 1647//1647 1613//1613\nf 1613//1613 1631//1631 1618//1618\nf 1632//1632 1627//1627 1615//1615\nf 1615//1615 1633//1633 1611//1611\nf 1507//1507 105//105 96//96\nf 1482//1482 1458//1458 1137//1137\nf 1124//1124 944//944 1443//1443\nf 937//937 1447//1447 1497//1497\nf 1500//1500 864//864 1477//1477\nf 1630//1630 1032//1032 1626//1626\nf 1234//1234 1510//1510 687//687\nf 1634//1634 1635//1635 1622//1622\nf 1622//1622 1388//1388 1404//1404\nf 1473//1473 1513//1513 254//254\nf 1178//1178 209//209 705//705\nf 1278//1278 1637//1637 1623//1623\nf 1627//1627 1633//1633 1615//1615\nf 1628//1628 1634//1634 1622//1622\nf 937//937 1497//1497 1491//1491\nf 186//186 1455//1455 1452//1452\nf 732//732 937//937 1513//1513\nf 1639//1639 1636//1636 208//208\nf 554//554 1264//1264 1265//1265\nf 1654//1654 1213//1213 1640//1640\nf 1634//1634 1628//1628 1633//1633\nf 1634//1634 1388//1388 1635//1635\nf 1459//1459 1061//1061 732//732\nf 369//369 1308//1308 1114//1114\nf 1265//1265 1032//1032 1630//1630\nf 1153//1153 851//851 1151//1151\nf 1278//1278 1645//1645 1637//1637\nf 1647//1647 1638//1638 1613//1613\nf 1638//1638 1631//1631 1613//1613\nf 1648//1648 1632//1632 1631//1631\nf 1648//1648 1627//1627 1632//1632\nf 1423//1423 1525//1525 1495//1495\nf 1031//1031 653//653 1547//1547\nf 1636//1636 1630//1630 208//208\nf 1636//1636 1265//1265 1630//1630\nf 1640//1640 1647//1647 1637//1637\nf 1638//1638 1641//1641 1631//1631\nf 1642//1642 1633//1633 1627//1627\nf 1633//1633 1643//1643 1634//1634\nf 1634//1634 1644//1644 1388//1388\nf 843//843 1500//1500 1144//1144\nf 866//866 864//864 1500//1500\nf 1517//1517 979//979 1493//1493\nf 68//68 1131//1131 785//785\nf 1104//1104 1506//1506 97//97\nf 89//89 1442//1442 1201//1201\nf 1645//1645 1640//1640 1637//1637\nf 1641//1641 1648//1648 1631//1631\nf 1648//1648 1642//1642 1627//1627\nf 1634//1634 1649//1649 1644//1644\nf 1493//1493 1533//1533 1525//1525\nf 1489//1489 1517//1517 1493//1493\nf 1038//1038 1472//1472 1463//1463\nf 613//613 1265//1265 1636//1636\nf 1503//1503 1079//1079 1125//1125\nf 1642//1642 1643//1643 1633//1633\nf 1649//1649 1634//1634 1643//1643\nf 1529//1529 514//514 869//869\nf 1493//1493 1599//1599 1533//1533\nf 1096//1096 992//992 761//761\nf 680//680 158//158 1665//1665\nf 761//761 1129//1129 1786//1786\nf 1278//1278 1651//1651 1645//1645\nf 321//321 1023//1023 245//245\nf 1560//1560 1550//1550 87//87\nf 1677//1677 1521//1521 8//8\nf 1489//1489 979//979 1517//1517\nf 1096//1096 761//761 1786//1786\nf 1129//1129 385//385 1121//1121\nf 305//305 313//313 1639//1639\nf 1082//1082 1639//1639 313//313\nf 1082//1082 1636//1636 1639//1639\nf 104//104 613//613 1636//1636\nf 653//653 1478//1478 1463//1463\nf 1651//1651 1646//1646 1645//1645\nf 1646//1646 1640//1640 1645//1645\nf 1640//1640 1638//1638 1647//1647\nf 1641//1641 1091//1091 1648//1648\nf 1655//1655 1642//1642 1648//1648\nf 1655//1655 1643//1643 1642//1642\nf 1655//1655 1649//1649 1643//1643\nf 1644//1644 1403//1403 1388//1388\nf 1433//1433 336//336 1510//1510\nf 385//385 1129//1129 761//761\nf 1653//1653 313//313 305//305\nf 104//104 1244//1244 613//613\nf 1278//1278 1650//1650 1651//1651\nf 1091//1091 1655//1655 1648//1648\nf 1644//1644 1649//1649 1403//1403\nf 1135//1135 325//325 1676//1676\nf 680//680 69//69 158//158\nf 1653//1653 1082//1082 313//313\nf 1137//1137 302//302 804//804\nf 1654//1654 1640//1640 1646//1646\nf 724//724 1441//1441 1260//1260\nf 804//804 855//855 1137//1137\nf 105//105 1507//1507 743//743\nf 1113//1113 160//160 104//104\nf 1655//1655 1084//1084 1649//1649\nf 978//978 1652//1652 1258//1258\nf 1398//1398 1508//1508 719//719\nf 1082//1082 104//104 1636//1636\nf 1651//1651 678//678 1646//1646\nf 1084//1084 1403//1403 1649//1649\nf 1707//1707 1656//1656 1672//1672\nf 1625//1625 1705//1705 1712//1712\nf 768//768 3//3 2//2\nf 609//609 795//795 295//295\nf 1679//1679 1684//1684 1687//1687\nf 768//768 1683//1683 3//3\nf 1670//1670 1693//1693 1676//1676\nf 297//297 1682//1682 765//765\nf 1672//1672 1657//1657 1673//1673\nf 18//18 1674//1674 1680//1680\nf 1707//1707 1672//1672 1674//1674\nf 1663//1663 1675//1675 1700//1700\nf 1656//1656 1658//1658 1657//1657\nf 419//419 85//85 916//916\nf 1527//1527 1515//1515 765//765\nf 1659//1659 1658//1658 568//568\nf 871//871 1696//1696 765//765\nf 814//814 1698//1698 99//99\nf 1660//1660 822//822 6//6\nf 61//61 1014//1014 849//849\nf 1014//1014 111//111 1214//1214\nf 662//662 1039//1039 1693//1693\nf 1661//1661 1704//1704 18//18\nf 1694//1694 1674//1674 18//18\nf 1664//1664 1716//1716 1744//1744\nf 1014//1014 116//116 111//111\nf 345//345 1734//1734 33//33\nf 1671//1671 1664//1664 1744//1744\nf 1671//1671 1744//1744 1739//1739\nf 1678//1678 1671//1671 1739//1739\nf 1662//1662 5//5 4//4\nf 1085//1085 1684//1684 1679//1679\nf 1729//1729 794//794 1131//1131\nf 1684//1684 1768//1768 1197//1197\nf 1678//1678 1739//1739 1197//1197\nf 1280//1280 1787//1787 854//854\nf 295//295 1039//1039 609//609\nf 1280//1280 1690//1690 1787//1787\nf 871//871 19//19 1709//1709\nf 871//871 1681//1681 1696//1696\nf 1706//1706 11//11 1671//1671\nf 1085//1085 1768//1768 1684//1684\nf 1197//1197 1739//1739 1687//1687\nf 1751//1751 871//871 1682//1682\nf 1751//1751 19//19 871//871\nf 1774//1774 1704//1704 1661//1661\nf 1136//1136 48//48 426//426\nf 151//151 324//324 1135//1135\nf 1708//1708 1656//1656 1707//1707\nf 1742//1742 345//345 1688//1688\nf 1686//1686 1692//1692 1685//1685\nf 1685//1685 1692//1692 803//803\nf 1673//1673 1657//1657 1//1\nf 1039//1039 125//125 609//609\nf 1672//1672 1673//1673 1691//1691\nf 1629//1629 1219//1219 1768//1768\nf 1687//1687 1276//1276 1668//1668\nf 1494//1494 1751//1751 1682//1682\nf 1774//1774 19//19 1751//1751\nf 1774//1774 1661//1661 19//19\nf 1680//1680 1672//1672 17//17\nf 1736//1736 1707//1707 1674//1674\nf 1668//1668 1679//1679 1687//1687\nf 1689//1689 1659//1659 2//2\nf 1657//1657 1689//1689 1//1\nf 1294//1294 1282//1282 1459//1459\nf 1699//1699 1679//1679 1668//1668\nf 1697//1697 1131//1131 1723//1723\nf 1699//1699 1668//1668 1697//1697\nf 1716//1716 1663//1663 1700//1700\nf 1693//1693 1039//1039 295//295\nf 1683//1683 768//768 358//358\nf 1670//1670 662//662 1693//1693\nf 803//803 1703//1703 825//825\nf 1029//1029 1068//1068 1785//1785\nf 823//823 1625//1625 779//779\nf 120//120 814//814 862//862\nf 1219//1219 1671//1671 1678//1678\nf 1704//1704 1694//1694 18//18\nf 1659//1659 1711//1711 2//2\nf 751//751 1731//1731 1730//1730\nf 1702//1702 751//751 1730//1730\nf 1694//1694 1736//1736 1674//1674\nf 1732//1732 1695//1695 99//99\nf 1692//1692 1703//1703 803//803\nf 784//784 1730//1730 1720//1720\nf 1681//1681 871//871 1709//1709\nf 1708//1708 1710//1710 1656//1656\nf 534//534 757//757 676//676\nf 1692//1692 1211//1211 1703//1703\nf 12//12 1706//1706 1671//1671\nf 1768//1768 1219//1219 1197//1197\nf 1219//1219 1678//1678 1197//1197\nf 1665//1665 1717//1717 1722//1722\nf 1730//1730 1726//1726 1720//1720\nf 1730//1730 1073//1073 1726//1726\nf 1211//1211 1117//1117 1703//1703\nf 1703//1703 1721//1721 825//825\nf 1683//1683 1662//1662 3//3\nf 1714//1714 1720//1720 1722//1722\nf 1717//1717 1787//1787 1714//1714\nf 1731//1731 1723//1723 1073//1073\nf 295//295 1718//1718 1812//1812\nf 1693//1693 295//295 1667//1667\nf 1660//1660 681//681 822//822\nf 825//825 1721//1721 1715//1715\nf 1727//1727 1732//1732 1719//1719\nf 346//346 1063//1063 1046//1046\nf 1739//1739 1744//1744 1276//1276\nf 1076//1076 1090//1090 1072//1072\nf 784//784 1720//1720 1690//1690\nf 1276//1276 685//685 1729//1729\nf 1693//1693 1667//1667 1666//1666\nf 1676//1676 1693//1693 1666//1666\nf 295//295 1812//1812 1667//1667\nf 1717//1717 1665//1665 311//311\nf 1679//1679 1699//1699 1701//1701\nf 7//7 10//10 1728//1728\nf 677//677 650//650 596//596\nf 382//382 32//32 362//362\nf 1724//1724 1805//1805 1773//1773\nf 1728//1728 10//10 1695//1695\nf 1721//1721 1090//1090 1715//1715\nf 1787//1787 1717//1717 1413//1413\nf 1684//1684 1197//1197 1687//1687\nf 1719//1719 1698//1698 1086//1086\nf 1117//1117 1740//1740 1703//1703\nf 1740//1740 1735//1735 1721//1721\nf 1703//1703 1740//1740 1721//1721\nf 1090//1090 1721//1721 1735//1735\nf 510//510 749//749 1746//1746\nf 1744//1744 1716//1716 1727//1727\nf 1718//1718 295//295 795//795\nf 1117//1117 1733//1733 1740//1740\nf 1719//1719 1732//1732 1698//1698\nf 1697//1697 1668//1668 1131//1131\nf 1135//1135 1666//1666 1724//1724\nf 1695//1695 713//713 99//99\nf 102//102 1688//1688 103//103\nf 392//392 1737//1737 102//102\nf 663//663 637//637 643//643\nf 1735//1735 1448//1448 1090//1090\nf 1090//1090 1448//1448 1072//1072\nf 437//437 100//100 494//494\nf 1690//1690 1280//1280 784//784\nf 1486//1486 1466//1466 1343//1343\nf 1737//1737 1688//1688 102//102\nf 345//345 1742//1742 1734//1734\nf 1742//1742 1743//1743 1734//1734\nf 1736//1736 830//830 1707//1707\nf 830//830 1708//1708 1707//1707\nf 1486//1486 1333//1333 1466//1466\nf 953//953 1127//1127 1743//1743\nf 1748//1748 1448//1448 1735//1735\nf 880//880 893//893 646//646\nf 1731//1731 1147//1147 1697//1697\nf 830//830 1710//1710 1708//1708\nf 1710//1710 1713//1713 1656//1656\nf 119//119 1740//1740 1733//1733\nf 1333//1333 1745//1745 1466//1466\nf 1688//1688 1750//1750 1742//1742\nf 1742//1742 1759//1759 1743//1743\nf 680//680 1073//1073 69//69\nf 1073//1073 1723//1723 69//69\nf 119//119 1748//1748 1740//1740\nf 1748//1748 1735//1735 1740//1740\nf 1466//1466 1745//1745 1737//1737\nf 1737//1737 1741//1741 1688//1688\nf 1705//1705 1702//1702 784//784\nf 1666//1666 625//625 1724//1724\nf 1723//1723 1131//1131 68//68\nf 1026//1026 1056//1056 468//468\nf 1445//1445 15//15 1702//1702\nf 559//559 523//523 531//531\nf 1658//1658 1659//1659 1689//1689\nf 1340//1340 1747//1747 1333//1333\nf 1333//1333 1749//1749 1745//1745\nf 1688//1688 1741//1741 1750//1750\nf 1742//1742 1750//1750 1759//1759\nf 1110//1110 953//953 1743//1743\nf 1748//1748 119//119 142//142\nf 1672//1672 1691//1691 1629//1629\nf 1672//1672 1629//1629 17//17\nf 1658//1658 1689//1689 1657//1657\nf 1746//1746 749//749 1448//1448\nf 358//358 768//768 1711//1711\nf 1747//1747 1749//1749 1333//1333\nf 1147//1147 1701//1701 1699//1699\nf 1760//1760 1308//1308 1339//1339\nf 1240//1240 782//782 1323//1323\nf 1746//1746 1448//1448 1748//1748\nf 523//523 1746//1746 1748//1748\nf 317//317 718//718 596//596\nf 149//149 1494//1494 1725//1725\nf 1759//1759 1110//1110 1743//1743\nf 1726//1726 1073//1073 680//680\nf 727//727 720//720 1662//1662\nf 1696//1696 1681//1681 1527//1527\nf 1773//1773 1751//1751 1494//1494\nf 149//149 1773//1773 1494//1494\nf 1543//1543 1752//1752 1102//1102\nf 953//953 1110//1110 1087//1087\nf 1745//1745 1753//1753 1737//1737\nf 1737//1737 1753//1753 1741//1741\nf 1754//1754 1756//1756 1741//1741\nf 392//392 1343//1343 1737//1737\nf 822//822 113//113 1521//1521\nf 558//558 531//531 1748//1748\nf 531//531 523//523 1748//1748\nf 995//995 880//880 646//646\nf 1543//1543 1757//1757 1752//1752\nf 1814//1814 1694//1694 1704//1704\nf 1747//1747 1755//1755 1749//1749\nf 1749//1749 1765//1765 1745//1745\nf 1753//1753 1758//1758 1741//1741\nf 1741//1741 1758//1758 1754//1754\nf 1750//1750 1741//1741 1756//1756\nf 1756//1756 1764//1764 1750//1750\nf 1764//1764 1759//1759 1750//1750\nf 1276//1276 1744//1744 685//685\nf 1814//1814 1736//1736 1694//1694\nf 1108//1108 1100//1100 1102//1102\nf 1724//1724 625//625 1805//1805\nf 1404//1404 1604//1604 1610//1610\nf 1749//1749 1755//1755 1765//1765\nf 1745//1745 1758//1758 1753//1753\nf 1761//1761 1110//1110 1759//1759\nf 1466//1466 1737//1737 1343//1343\nf 437//437 116//116 100//100\nf 1687//1687 1739//1739 1276//1276\nf 1752//1752 1767//1767 1102//1102\nf 1760//1760 1755//1755 1747//1747\nf 1756//1756 1754//1754 1764//1764\nf 1571//1571 1280//1280 854//854\nf 1702//1702 1147//1147 751//751\nf 1656//1656 1657//1657 1672//1672\nf 12//12 1671//1671 1219//1219\nf 1762//1762 1752//1752 1757//1757\nf 1767//1767 1108//1108 1102//1102\nf 1727//1727 1624//1624 1732//1732\nf 1712//1712 1705//1705 1280//1280\nf 68//68 785//785 69//69\nf 559//559 531//531 546//546\nf 1621//1621 1619//1619 1234//1234\nf 1770//1770 1762//1762 1757//1757\nf 103//103 1688//1688 345//345\nf 1339//1339 1755//1755 1760//1760\nf 1755//1755 233//233 1765//1765\nf 1745//1745 1766//1766 1758//1758\nf 1758//1758 1764//1764 1754//1754\nf 1763//1763 1761//1761 1759//1759\nf 1761//1761 1772//1772 1110//1110\nf 1340//1340 1760//1760 1747//1747\nf 1676//1676 1666//1666 1135//1135\nf 1731//1731 1697//1697 1723//1723\nf 1775//1775 1752//1752 1762//1762\nf 1767//1767 1781//1781 1108//1108\nf 1781//1781 1106//1106 1108//1108\nf 1765//1765 1766//1766 1745//1745\nf 1764//1764 1763//1763 1759//1759\nf 1773//1773 1774//1774 1751//1751\nf 1812//1812 1814//1814 1704//1704\nf 1435//1435 1770//1770 1433//1433\nf 1781//1781 1767//1767 1752//1752\nf 233//233 1782//1782 1765//1765\nf 1712//1712 1280//1280 1571//1571\nf 1689//1689 2//2 1//1\nf 1775//1775 1781//1781 1752//1752\nf 1765//1765 1782//1782 1766//1766\nf 1766//1766 1769//1769 1758//1758\nf 1758//1758 1769//1769 1764//1764\nf 1778//1778 1783//1783 1761//1761\nf 1763//1763 1778//1778 1761//1761\nf 1770//1770 1775//1775 1762//1762\nf 1764//1764 1778//1778 1763//1763\nf 1761//1761 1783//1783 1772//1772\nf 233//233 1738//1738 1782//1782\nf 1769//1769 1777//1777 1764//1764\nf 273//273 256//256 775//775\nf 1670//1670 995//995 662//662\nf 1619//1619 1770//1770 1435//1435\nf 1766//1766 590//590 1769//1769\nf 1771//1771 1778//1778 1764//1764\nf 1702//1702 1730//1730 784//784\nf 1784//1784 1775//1775 1770//1770\nf 1790//1790 1781//1781 1775//1775\nf 590//590 1776//1776 1769//1769\nf 1777//1777 1771//1771 1764//1764\nf 1783//1783 1779//1779 1772//1772\nf 1772//1772 1779//1779 1071//1071\nf 625//625 1704//1704 1774//1774\nf 625//625 1812//1812 1704//1704\nf 1621//1621 1245//1245 1619//1619\nf 1780//1780 1770//1770 1619//1619\nf 1780//1780 1784//1784 1770//1770\nf 740//740 1736//1736 1814//1814\nf 1776//1776 1777//1777 1769//1769\nf 1791//1791 1778//1778 1771//1771\nf 1778//1778 1779//1779 1783//1783\nf 1726//1726 680//680 1722//1722\nf 734//734 1294//1294 1459//1459\nf 1803//1803 1619//1619 1245//1245\nf 1803//1803 1780//1780 1619//1619\nf 1789//1789 1784//1784 1780//1780\nf 1790//1790 1775//1775 1784//1784\nf 1797//1797 1781//1781 1790//1790\nf 1797//1797 1120//1120 1781//1781\nf 1824//1824 1818//1818 326//326\nf 1700//1700 1728//1728 1624//1624\nf 751//751 1147//1147 1731//1731\nf 1498//1498 1725//1725 297//297\nf 1129//1129 1120//1120 1797//1797\nf 62//62 63//63 72//72\nf 1132//1132 414//414 825//825\nf 1115//1115 1112//1112 250//250\nf 1785//1785 1777//1777 1776//1776\nf 1124//1124 724//724 1284//1284\nf 1792//1792 1789//1789 1780//1780\nf 1789//1789 1790//1790 1784//1784\nf 1096//1096 1798//1798 1075//1075\nf 1029//1029 1785//1785 1776//1776\nf 1785//1785 1771//1771 1777//1777\nf 1778//1778 1791//1791 1779//1779\nf 1794//1794 1798//1798 1096//1096\nf 1798//1798 1801//1801 1075//1075\nf 1799//1799 1791//1791 1771//1771\nf 1806//1806 1803//1803 1245//1245\nf 1803//1803 1792//1792 1780//1780\nf 1793//1793 1790//1790 1789//1789\nf 1794//1794 1786//1786 1129//1129\nf 1794//1794 1096//1096 1786//1786\nf 1075//1075 1801//1801 1620//1620\nf 742//742 458//458 594//594\nf 1799//1799 1771//1771 1785//1785\nf 1799//1799 1795//1795 1791//1791\nf 1787//1787 1690//1690 1714//1714\nf 685//685 1727//1727 1719//1719\nf 1729//1729 1086//1086 794//794\nf 1796//1796 1788//1788 1503//1503\nf 1807//1807 1803//1803 1806//1806\nf 1820//1820 1789//1789 1792//1792\nf 1068//1068 1799//1799 1785//1785\nf 1791//1791 1795//1795 1779//1779\nf 1796//1796 1503//1503 1125//1125\nf 1802//1802 1806//1806 1788//1788\nf 1808//1808 1792//1792 1803//1803\nf 1808//1808 1820//1820 1792//1792\nf 1820//1820 1793//1793 1789//1789\nf 1800//1800 1129//1129 1797//1797\nf 995//995 646//646 662//662\nf 685//685 1086//1086 1729//1729\nf 685//685 1719//1719 1086//1086\nf 1700//1700 1624//1624 1727//1727\nf 1802//1802 1788//1788 1796//1796\nf 1809//1809 1790//1790 1793//1793\nf 1809//1809 1797//1797 1790//1790\nf 1800//1800 1794//1794 1129//1129\nf 1810//1810 1798//1798 1794//1794\nf 1810//1810 1804//1804 1798//1798\nf 1804//1804 1801//1801 1798//1798\nf 1068//1068 1795//1795 1799//1799\nf 775//775 256//256 1779//1779\nf 1674//1674 1672//1672 1680//1680\nf 880//880 1670//1670 889//889\nf 20//20 1808//1808 1803//1803\nf 1811//1811 1620//1620 1801//1801\nf 880//880 995//995 1670//1670\nf 1795//1795 775//775 1779//1779\nf 1724//1724 1773//1773 149//149\nf 1805//1805 1774//1774 1773//1773\nf 1815//1815 1796//1796 1125//1125\nf 1650//1650 1815//1815 1125//1125\nf 1815//1815 1802//1802 1796//1796\nf 1813//1813 1807//1807 1806//1806\nf 20//20 1803//1803 1807//1807\nf 20//20 1820//1820 1808//1808\nf 1811//1811 1801//1801 1804//1804\nf 1805//1805 625//625 1774//1774\nf 1715//1715 1132//1132 825//825\nf 1802//1802 1813//1813 1806//1806\nf 1813//1813 20//20 1807//1807\nf 1809//1809 1793//1793 1820//1820\nf 1800//1800 1810//1810 1794//1794\nf 1822//1822 1811//1811 1804//1804\nf 1718//1718 740//740 1814//1814\nf 1062//1062 1620//1620 1823//1823\nf 1795//1795 1818//1818 775//775\nf 80//80 1483//1483 145//145\nf 1816//1816 1802//1802 1815//1815\nf 24//24 1820//1820 20//20\nf 590//590 1029//1029 1776//1776\nf 1818//1818 1824//1824 775//775\nf 1690//1690 1720//1720 1714//1714\nf 1825//1825 1815//1815 1650//1650\nf 1828//1828 1819//1819 1802//1802\nf 1819//1819 1813//1813 1802//1802\nf 1819//1819 20//20 1813//1813\nf 1819//1819 21//21 20//20\nf 1817//1817 1810//1810 1800//1800\nf 1822//1822 1804//1804 1810//1810\nf 1823//1823 1620//1620 1811//1811\nf 125//125 709//709 609//609\nf 1664//1664 11//11 1716//1716\nf 1816//1816 1828//1828 1802//1802\nf 1821//1821 1809//1809 1820//1820\nf 24//24 1821//1821 1820//1820\nf 604//604 1811//1811 1822//1822\nf 604//604 1823//1823 1811//1811\nf 1086//1086 1698//1698 794//794\nf 1629//1629 1691//1691 12//12\nf 1528//1528 1705//1705 1625//1625\nf 1731//1731 1073//1073 1730//1730\nf 1527//1527 1445//1445 1705//1705\nf 1527//1527 1681//1681 1445//1445\nf 1705//1705 1445//1445 1702//1702\nf 1817//1817 1822//1822 1810//1810\nf 1723//1723 68//68 69//69\nf 318//318 273//273 1824//1824\nf 1717//1717 1714//1714 1722//1722\nf 17//17 1629//1629 1768//1768\nf 1528//1528 1527//1527 1705//1705\nf 1825//1825 1827//1827 1815//1815\nf 1815//1815 1827//1827 1816//1816\nf 1819//1819 22//22 21//21\nf 1836//1836 1809//1809 1821//1821\nf 604//604 571//571 1823//1823\nf 227//227 1071//1071 1779//1779\nf 1014//1014 1182//1182 1180//1180\nf 1722//1722 680//680 1665//1665\nf 1718//1718 1814//1814 1812//1812\nf 1829//1829 1828//1828 1816//1816\nf 23//23 1821//1821 24//24\nf 23//23 1836//1836 1821//1821\nf 1831//1831 604//604 1822//1822\nf 720//720 1660//1660 6//6\nf 644//644 568//568 1658//1658\nf 1718//1718 795//795 740//740\nf 1826//1826 1827//1827 1825//1825\nf 1829//1829 1816//1816 1827//1827\nf 1830//1830 22//22 1819//1819\nf 1809//1809 1836//1836 14//14\nf 5//5 720//720 6//6\nf 11//11 1663//1663 1716//1716\nf 1829//1829 1833//1833 1828//1828\nf 1833//1833 1819//1819 1828//1828\nf 13//13 1834//1834 1817//1817\nf 1834//1834 1822//1822 1817//1817\nf 1834//1834 1831//1831 1822//1822\nf 15//15 1147//1147 1702//1702\nf 1187//1187 1830//1830 1819//1819\nf 1281//1281 604//604 1831//1831\nf 15//15 1701//1701 1147//1147\nf 1668//1668 1729//1729 1131//1131\nf 1826//1826 1835//1835 1827//1827\nf 1835//1835 1829//1829 1827//1827\nf 1833//1833 1187//1187 1819//1819\nf 1837//1837 14//14 1836//1836\nf 1625//1625 1712//1712 1571//1571\nf 779//779 1625//1625 1571//1571\nf 1720//1720 1726//1726 1722//1722\nf 1003//1003 1826//1826 1832//1832\nf 1003//1003 1835//1835 1826//1826\nf 1835//1835 1833//1833 1829//1829\nf 1187//1187 22//22 1830//1830\nf 1837//1837 1836//1836 23//23\nf 1838//1838 1834//1834 13//13\nf 1281//1281 1831//1831 1834//1834\nf 1668//1668 1276//1276 1729//1729\nf 17//17 1768//1768 1085//1085\nf 590//590 1766//1766 1839//1839\nf 1766//1766 1782//1782 1839//1839\nf 1782//1782 1738//1738 1839//1839\nf 1738//1738 983//983 1839//1839\nf 983//983 1054//1054 1839//1839\nf 1054//1054 817//817 1839//1839\nf 817//817 590//590 1839//1839\n"
  },
  {
    "path": "Resources/models/convert_three.js",
    "content": "//Converts a three.js triangulated mesh into a polygonal mesh\nvar fs = require('fs');\nvar mesh = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));\n\n\nvar positions = [];\nvar VP = mesh.vertexPositions;\nfor(var i=0; i<VP.length; i+=3) {\n  positions.push([VP[i], VP[i+1], VP[i+2]]);\n}\n\nvar faces = [];\nvar FP = mesh.indices;\nfor(var i=0; i<FP.length; i+=3) {\n  faces.push([FP[i], FP[i+1], FP[i+2]]);\n}\n\nconsole.log(JSON.stringify({\n    positions: positions\n  , faces: faces\n}));\n\n\n"
  },
  {
    "path": "Resources/models/teapot.js",
    "content": "{\"positions\":[[5.929688,4.125,0],[5.387188,4.125,2.7475],[5.2971,4.494141,2.70917],[5.832031,4.494141,0],[5.401602,4.617188,2.753633],[5.945313,4.617188,0],[5.614209,4.494141,2.844092],[6.175781,4.494141,0],[5.848437,4.125,2.94375],[6.429688,4.125,0],[3.899688,4.125,4.97],[3.830352,4.494141,4.900664],[3.910782,4.617188,4.981094],[4.074414,4.494141,5.144727],[4.254687,4.125,5.325],[1.677188,4.125,6.4575],[1.638858,4.494141,6.367412],[1.68332,4.617188,6.471914],[1.77378,4.494141,6.684522],[1.873438,4.125,6.91875],[-1.070312,4.125,7],[-1.070312,4.494141,6.902344],[-1.070312,4.617188,7.015625],[-1.070312,4.494141,7.246094],[-1.070312,4.125,7.5],[-1.070312,4.125,7],[-4.007656,4.125,6.4575],[-3.859572,4.494141,6.367412],[-1.070312,4.494141,6.902344],[-3.847676,4.617188,6.471914],[-1.070312,4.617188,7.015625],[-3.917371,4.494141,6.684522],[-1.070312,4.494141,7.246094],[-4.014062,4.125,6.91875],[-1.070312,4.125,7.5],[-6.209063,4.125,4.97],[-6.042168,4.494141,4.900664],[-6.0725,4.617188,4.981094],[-6.217675,4.494141,5.144727],[-6.395312,4.125,5.325],[-7.591093,4.125,2.7475],[-7.464421,4.494141,2.70917],[-7.550137,4.617188,2.753633],[-7.755822,4.494141,2.844092],[-7.989062,4.125,2.94375],[-8.070313,4.125,0],[-7.972656,4.494141,0],[-8.085938,4.617188,0],[-8.316406,4.494141,0],[-8.570313,4.125,0],[-8.070313,4.125,0],[-7.527812,4.125,-2.7475],[-7.437724,4.494141,-2.70917],[-7.972656,4.494141,0],[-7.542227,4.617188,-2.753633],[-8.085938,4.617188,0],[-7.754834,4.494141,-2.844092],[-8.316406,4.494141,0],[-7.989062,4.125,-2.94375],[-8.570313,4.125,0],[-6.040312,4.125,-4.97],[-5.970977,4.494141,-4.900664],[-6.051406,4.617188,-4.981094],[-6.215039,4.494141,-5.144727],[-6.395312,4.125,-5.325],[-3.817812,4.125,-6.4575],[-3.779482,4.494141,-6.367412],[-3.823945,4.617188,-6.471914],[-3.914404,4.494141,-6.684522],[-4.014062,4.125,-6.91875],[-1.070312,4.125,-7],[-1.070312,4.494141,-6.902344],[-1.070312,4.617188,-7.015625],[-1.070312,4.494141,-7.246094],[-1.070312,4.125,-7.5],[-1.070312,4.125,-7],[1.677188,4.125,-6.4575],[1.638858,4.494141,-6.367412],[-1.070312,4.494141,-6.902344],[1.68332,4.617188,-6.471914],[-1.070312,4.617188,-7.015625],[1.77378,4.494141,-6.684522],[-1.070312,4.494141,-7.246094],[1.873438,4.125,-6.91875],[-1.070312,4.125,-7.5],[3.899688,4.125,-4.97],[3.830352,4.494141,-4.900664],[3.910782,4.617188,-4.981094],[4.074414,4.494141,-5.144727],[4.254687,4.125,-5.325],[5.387188,4.125,-2.7475],[5.2971,4.494141,-2.70917],[5.401602,4.617188,-2.753633],[5.614209,4.494141,-2.844092],[5.848437,4.125,-2.94375],[5.929688,4.125,0],[5.832031,4.494141,0],[5.945313,4.617188,0],[6.175781,4.494141,0],[6.429688,4.125,0],[6.429688,4.125,0],[5.848437,4.125,2.94375],[6.695264,2.162109,3.304053],[7.347656,2.162109,0],[7.433985,0.234375,3.61836],[8.148438,0.234375,0],[7.956494,-1.623047,3.840674],[8.714844,-1.623047,0],[8.154688,-3.375,3.925],[8.929688,-3.375,0],[4.254687,4.125,5.325],[4.906446,2.162109,5.976758],[5.475,0.234375,6.545312],[5.877149,-1.623047,6.947461],[6.029688,-3.375,7.1],[1.873438,4.125,6.91875],[2.23374,2.162109,7.765576],[2.548047,0.234375,8.504297],[2.770362,-1.623047,9.026807],[2.854688,-3.375,9.225],[-1.070312,4.125,7.5],[-1.070312,2.162109,8.417969],[-1.070312,0.234375,9.21875],[-1.070312,-1.623047,9.785156],[-1.070312,-3.375,10],[-1.070312,4.125,7.5],[-4.014062,4.125,6.91875],[-4.374365,2.162109,7.765576],[-1.070312,2.162109,8.417969],[-4.688672,0.234375,8.504297],[-1.070312,0.234375,9.21875],[-4.910986,-1.623047,9.026807],[-1.070312,-1.623047,9.785156],[-4.995313,-3.375,9.225],[-1.070312,-3.375,10],[-6.395312,4.125,5.325],[-7.047071,2.162109,5.976758],[-7.615624,0.234375,6.545312],[-8.017773,-1.623047,6.947461],[-8.170312,-3.375,7.1],[-7.989062,4.125,2.94375],[-8.835889,2.162109,3.304053],[-9.57461,0.234375,3.61836],[-10.097119,-1.623047,3.840674],[-10.295313,-3.375,3.925],[-8.570313,4.125,0],[-9.488281,2.162109,0],[-10.289063,0.234375,0],[-10.855469,-1.623047,0],[-11.070313,-3.375,0],[-8.570313,4.125,0],[-7.989062,4.125,-2.94375],[-8.835889,2.162109,-3.304053],[-9.488281,2.162109,0],[-9.57461,0.234375,-3.61836],[-10.289063,0.234375,0],[-10.097119,-1.623047,-3.840674],[-10.855469,-1.623047,0],[-10.295313,-3.375,-3.925],[-11.070313,-3.375,0],[-6.395312,4.125,-5.325],[-7.047071,2.162109,-5.976758],[-7.615624,0.234375,-6.545312],[-8.017773,-1.623047,-6.947461],[-8.170312,-3.375,-7.1],[-4.014062,4.125,-6.91875],[-4.374365,2.162109,-7.765576],[-4.688672,0.234375,-8.504297],[-4.910986,-1.623047,-9.026807],[-4.995313,-3.375,-9.225],[-1.070312,4.125,-7.5],[-1.070312,2.162109,-8.417969],[-1.070312,0.234375,-9.21875],[-1.070312,-1.623047,-9.785156],[-1.070312,-3.375,-10],[-1.070312,4.125,-7.5],[1.873438,4.125,-6.91875],[2.23374,2.162109,-7.765576],[-1.070312,2.162109,-8.417969],[2.548047,0.234375,-8.504297],[-1.070312,0.234375,-9.21875],[2.770362,-1.623047,-9.026807],[-1.070312,-1.623047,-9.785156],[2.854688,-3.375,-9.225],[-1.070312,-3.375,-10],[4.254687,4.125,-5.325],[4.906446,2.162109,-5.976758],[5.475,0.234375,-6.545312],[5.877149,-1.623047,-6.947461],[6.029688,-3.375,-7.1],[5.848437,4.125,-2.94375],[6.695264,2.162109,-3.304053],[7.433985,0.234375,-3.61836],[7.956494,-1.623047,-3.840674],[8.154688,-3.375,-3.925],[6.429688,4.125,0],[7.347656,2.162109,0],[8.148438,0.234375,0],[8.714844,-1.623047,0],[8.929688,-3.375,0],[8.929688,-3.375,0],[8.154688,-3.375,3.925],[7.794336,-4.857422,3.77168],[8.539063,-4.857422,0],[7.001562,-5.953125,3.434375],[7.679688,-5.953125,0],[6.208789,-6.697266,3.09707],[6.820313,-6.697266,0],[5.848437,-7.125,2.94375],[6.429688,-7.125,0],[6.029688,-3.375,7.1],[5.752343,-4.857422,6.822656],[5.142187,-5.953125,6.2125],[4.532031,-6.697266,5.602344],[4.254687,-7.125,5.325],[2.854688,-3.375,9.225],[2.701367,-4.857422,8.864649],[2.364063,-5.953125,8.071875],[2.026758,-6.697266,7.279101],[1.873438,-7.125,6.91875],[-1.070312,-3.375,10],[-1.070312,-4.857422,9.609375],[-1.070312,-5.953125,8.75],[-1.070312,-6.697266,7.890625],[-1.070312,-7.125,7.5],[-1.070312,-3.375,10],[-4.995313,-3.375,9.225],[-4.841992,-4.857422,8.864649],[-1.070312,-4.857422,9.609375],[-4.504687,-5.953125,8.071875],[-1.070312,-5.953125,8.75],[-4.167383,-6.697266,7.279101],[-1.070312,-6.697266,7.890625],[-4.014062,-7.125,6.91875],[-1.070312,-7.125,7.5],[-8.170312,-3.375,7.1],[-7.892968,-4.857422,6.822656],[-7.282812,-5.953125,6.2125],[-6.672656,-6.697266,5.602344],[-6.395312,-7.125,5.325],[-10.295313,-3.375,3.925],[-9.934961,-4.857422,3.77168],[-9.142187,-5.953125,3.434375],[-8.349414,-6.697266,3.09707],[-7.989062,-7.125,2.94375],[-11.070313,-3.375,0],[-10.679688,-4.857422,0],[-9.820313,-5.953125,0],[-8.960938,-6.697266,0],[-8.570313,-7.125,0],[-11.070313,-3.375,0],[-10.295313,-3.375,-3.925],[-9.934961,-4.857422,-3.77168],[-10.679688,-4.857422,0],[-9.142187,-5.953125,-3.434375],[-9.820313,-5.953125,0],[-8.349414,-6.697266,-3.09707],[-8.960938,-6.697266,0],[-7.989062,-7.125,-2.94375],[-8.570313,-7.125,0],[-8.170312,-3.375,-7.1],[-7.892968,-4.857422,-6.822656],[-7.282812,-5.953125,-6.2125],[-6.672656,-6.697266,-5.602344],[-6.395312,-7.125,-5.325],[-4.995313,-3.375,-9.225],[-4.841992,-4.857422,-8.864649],[-4.504687,-5.953125,-8.071875],[-4.167383,-6.697266,-7.279101],[-4.014062,-7.125,-6.91875],[-1.070312,-3.375,-10],[-1.070312,-4.857422,-9.609375],[-1.070312,-5.953125,-8.75],[-1.070312,-6.697266,-7.890625],[-1.070312,-7.125,-7.5],[-1.070312,-3.375,-10],[2.854688,-3.375,-9.225],[2.701367,-4.857422,-8.864649],[-1.070312,-4.857422,-9.609375],[2.364063,-5.953125,-8.071875],[-1.070312,-5.953125,-8.75],[2.026758,-6.697266,-7.279101],[-1.070312,-6.697266,-7.890625],[1.873438,-7.125,-6.91875],[-1.070312,-7.125,-7.5],[6.029688,-3.375,-7.1],[5.752343,-4.857422,-6.822656],[5.142187,-5.953125,-6.2125],[4.532031,-6.697266,-5.602344],[4.254687,-7.125,-5.325],[8.154688,-3.375,-3.925],[7.794336,-4.857422,-3.77168],[7.001562,-5.953125,-3.434375],[6.208789,-6.697266,-3.09707],[5.848437,-7.125,-2.94375],[8.929688,-3.375,0],[8.539063,-4.857422,0],[7.679688,-5.953125,0],[6.820313,-6.697266,0],[6.429688,-7.125,0],[6.429688,-7.125,0],[5.848437,-7.125,2.94375],[5.691685,-7.400391,2.877056],[6.259766,-7.400391,0],[4.853868,-7.640625,2.520586],[5.351563,-7.640625,0],[2.783648,-7.810547,1.639761],[3.107422,-7.810547,0],[-1.070312,-7.875,0],[4.254687,-7.125,5.325],[4.134043,-7.400391,5.204355],[3.489219,-7.640625,4.559531],[1.895879,-7.810547,2.966191],[-1.070312,-7.875,0],[1.873438,-7.125,6.91875],[1.806743,-7.400391,6.761997],[1.450274,-7.640625,5.92418],[0.569448,-7.810547,3.85396],[-1.070312,-7.875,0],[-1.070312,-7.125,7.5],[-1.070312,-7.400391,7.330078],[-1.070312,-7.640625,6.421875],[-1.070312,-7.810547,4.177734],[-1.070312,-7.875,0],[-1.070312,-7.125,7.5],[-4.014062,-7.125,6.91875],[-3.947368,-7.400391,6.761997],[-1.070312,-7.400391,7.330078],[-3.590898,-7.640625,5.92418],[-1.070312,-7.640625,6.421875],[-2.710073,-7.810547,3.85396],[-1.070312,-7.810547,4.177734],[-1.070312,-7.875,0],[-6.395312,-7.125,5.325],[-6.274668,-7.400391,5.204355],[-5.629844,-7.640625,4.559531],[-4.036504,-7.810547,2.966191],[-1.070312,-7.875,0],[-7.989062,-7.125,2.94375],[-7.832309,-7.400391,2.877056],[-6.994492,-7.640625,2.520586],[-4.924272,-7.810547,1.639761],[-1.070312,-7.875,0],[-8.570313,-7.125,0],[-8.400391,-7.400391,0],[-7.492188,-7.640625,0],[-5.248047,-7.810547,0],[-1.070312,-7.875,0],[-8.570313,-7.125,0],[-7.989062,-7.125,-2.94375],[-7.832309,-7.400391,-2.877056],[-8.400391,-7.400391,0],[-6.994492,-7.640625,-2.520586],[-7.492188,-7.640625,0],[-4.924272,-7.810547,-1.639761],[-5.248047,-7.810547,0],[-1.070312,-7.875,0],[-6.395312,-7.125,-5.325],[-6.274668,-7.400391,-5.204355],[-5.629844,-7.640625,-4.559531],[-4.036504,-7.810547,-2.966191],[-1.070312,-7.875,0],[-4.014062,-7.125,-6.91875],[-3.947368,-7.400391,-6.761997],[-3.590898,-7.640625,-5.92418],[-2.710073,-7.810547,-3.85396],[-1.070312,-7.875,0],[-1.070312,-7.125,-7.5],[-1.070312,-7.400391,-7.330078],[-1.070312,-7.640625,-6.421875],[-1.070312,-7.810547,-4.177734],[-1.070312,-7.875,0],[-1.070312,-7.125,-7.5],[1.873438,-7.125,-6.91875],[1.806743,-7.400391,-6.761997],[-1.070312,-7.400391,-7.330078],[1.450274,-7.640625,-5.92418],[-1.070312,-7.640625,-6.421875],[0.569448,-7.810547,-3.85396],[-1.070312,-7.810547,-4.177734],[-1.070312,-7.875,0],[4.254687,-7.125,-5.325],[4.134043,-7.400391,-5.204355],[3.489219,-7.640625,-4.559531],[1.895879,-7.810547,-2.966191],[-1.070312,-7.875,0],[5.848437,-7.125,-2.94375],[5.691685,-7.400391,-2.877056],[4.853868,-7.640625,-2.520586],[2.783648,-7.810547,-1.639761],[-1.070312,-7.875,0],[6.429688,-7.125,0],[6.259766,-7.400391,0],[5.351563,-7.640625,0],[3.107422,-7.810547,0],[-1.070312,-7.875,0],[-9.070313,2.25,0],[-8.992188,2.425781,0.84375],[-11.47583,2.405457,0.84375],[-11.40625,2.232422,0],[-13.298828,2.263184,0.84375],[-13.132813,2.109375,0],[-14.421631,1.877014,0.84375],[-14.203125,1.775391,0],[-14.804688,1.125,0.84375],[-14.570313,1.125,0],[-8.820313,2.8125,1.125],[-11.628906,2.786134,1.125],[-13.664063,2.601563,1.125],[-14.902344,2.100586,1.125],[-15.320313,1.125,1.125],[-8.648438,3.199219,0.84375],[-11.781982,3.166809,0.84375],[-14.029297,2.939941,0.84375],[-15.383057,2.324158,0.84375],[-15.835938,1.125,0.84375],[-8.570313,3.375,0],[-11.851563,3.339844,0],[-14.195313,3.09375,0],[-15.601563,2.425781,0],[-16.070313,1.125,0],[-8.570313,3.375,0],[-8.648438,3.199219,-0.84375],[-11.781982,3.166809,-0.84375],[-11.851563,3.339844,0],[-14.029297,2.939941,-0.84375],[-14.195313,3.09375,0],[-15.383057,2.324158,-0.84375],[-15.601563,2.425781,0],[-15.835938,1.125,-0.84375],[-16.070313,1.125,0],[-8.820313,2.8125,-1.125],[-11.628906,2.786134,-1.125],[-13.664063,2.601563,-1.125],[-14.902344,2.100586,-1.125],[-15.320313,1.125,-1.125],[-8.992188,2.425781,-0.84375],[-11.47583,2.405457,-0.84375],[-13.298828,2.263184,-0.84375],[-14.421631,1.877014,-0.84375],[-14.804688,1.125,-0.84375],[-9.070313,2.25,0],[-11.40625,2.232422,0],[-13.132813,2.109375,0],[-14.203125,1.775391,0],[-14.570313,1.125,0],[-14.570313,1.125,0],[-14.804688,1.125,0.84375],[-14.588013,0.00705,0.84375],[-14.375,0.105469,0],[-13.90918,-1.275146,0.84375],[-13.757813,-1.125,0],[-12.724976,-2.540863,0.84375],[-12.671875,-2.355469,0],[-10.992188,-3.609375,0.84375],[-11.070313,-3.375,0],[-15.320313,1.125,1.125],[-15.056641,-0.209473,1.125],[-14.242188,-1.605469,1.125],[-12.841797,-2.94873,1.125],[-10.820313,-4.125,1.125],[-15.835938,1.125,0.84375],[-15.525269,-0.425995,0.84375],[-14.575195,-1.935791,0.84375],[-12.958618,-3.356598,0.84375],[-10.648438,-4.640625,0.84375],[-16.070313,1.125,0],[-15.738281,-0.524414,0],[-14.726563,-2.085938,0],[-13.011719,-3.541992,0],[-10.570313,-4.875,0],[-16.070313,1.125,0],[-15.835938,1.125,-0.84375],[-15.525269,-0.425995,-0.84375],[-15.738281,-0.524414,0],[-14.575195,-1.935791,-0.84375],[-14.726563,-2.085938,0],[-12.958618,-3.356598,-0.84375],[-13.011719,-3.541992,0],[-10.648438,-4.640625,-0.84375],[-10.570313,-4.875,0],[-15.320313,1.125,-1.125],[-15.056641,-0.209473,-1.125],[-14.242188,-1.605469,-1.125],[-12.841797,-2.94873,-1.125],[-10.820313,-4.125,-1.125],[-14.804688,1.125,-0.84375],[-14.588013,0.00705,-0.84375],[-13.90918,-1.275146,-0.84375],[-12.724976,-2.540863,-0.84375],[-10.992188,-3.609375,-0.84375],[-14.570313,1.125,0],[-14.375,0.105469,0],[-13.757813,-1.125,0],[-12.671875,-2.355469,0],[-11.070313,-3.375,0],[7.429688,-0.75,0],[7.429688,-1.394531,1.85625],[10.01123,-0.677124,1.676074],[9.828125,-0.199219,0],[11.101563,0.84668,1.279688],[10.867188,1.125,0],[11.723145,2.629761,0.883301],[11.4375,2.730469,0],[12.898438,4.125,0.703125],[12.429688,4.125,0],[7.429688,-2.8125,2.475],[10.414063,-1.728516,2.234766],[11.617188,0.234375,1.70625],[12.351563,2.408203,1.177734],[13.929688,4.125,0.9375],[7.429688,-4.230469,1.85625],[10.816895,-2.779907,1.676074],[12.132813,-0.37793,1.279688],[12.97998,2.186646,0.883301],[14.960938,4.125,0.703125],[7.429688,-4.875,0],[11,-3.257813,0],[12.367188,-0.65625,0],[13.265625,2.085938,0],[15.429688,4.125,0],[7.429688,-4.875,0],[7.429688,-4.230469,-1.85625],[10.816895,-2.779907,-1.676074],[11,-3.257813,0],[12.132813,-0.37793,-1.279688],[12.367188,-0.65625,0],[12.97998,2.186646,-0.883301],[13.265625,2.085938,0],[14.960938,4.125,-0.703125],[15.429688,4.125,0],[7.429688,-2.8125,-2.475],[10.414063,-1.728516,-2.234766],[11.617188,0.234375,-1.70625],[12.351563,2.408203,-1.177734],[13.929688,4.125,-0.9375],[7.429688,-1.394531,-1.85625],[10.01123,-0.677124,-1.676074],[11.101563,0.84668,-1.279688],[11.723145,2.629761,-0.883301],[12.898438,4.125,-0.703125],[7.429688,-0.75,0],[9.828125,-0.199219,0],[10.867188,1.125,0],[11.4375,2.730469,0],[12.429688,4.125,0],[12.429688,4.125,0],[12.898438,4.125,0.703125],[13.291077,4.346237,0.65918],[12.789063,4.335938,0],[13.525879,4.422729,0.5625],[13.054688,4.40625,0],[13.532898,4.350357,0.46582],[13.132813,4.335938,0],[13.242188,4.125,0.421875],[12.929688,4.125,0],[13.929688,4.125,0.9375],[14.395508,4.368896,0.878906],[14.5625,4.458984,0.75],[14.413086,4.38208,0.621094],[13.929688,4.125,0.5625],[14.960938,4.125,0.703125],[15.499939,4.391556,0.65918],[15.599121,4.495239,0.5625],[15.293274,4.413804,0.46582],[14.617188,4.125,0.421875],[15.429688,4.125,0],[16.001953,4.401855,0],[16.070313,4.511719,0],[15.693359,4.428224,0],[14.929688,4.125,0],[15.429688,4.125,0],[14.960938,4.125,-0.703125],[15.499939,4.391556,-0.65918],[16.001953,4.401855,0],[15.599121,4.495239,-0.5625],[16.070313,4.511719,0],[15.293274,4.413804,-0.46582],[15.693359,4.428224,0],[14.617188,4.125,-0.421875],[14.929688,4.125,0],[13.929688,4.125,-0.9375],[14.395508,4.368896,-0.878906],[14.5625,4.458984,-0.75],[14.413086,4.38208,-0.621094],[13.929688,4.125,-0.5625],[12.898438,4.125,-0.703125],[13.291077,4.346237,-0.65918],[13.525879,4.422729,-0.5625],[13.532898,4.350357,-0.46582],[13.242188,4.125,-0.421875],[12.429688,4.125,0],[12.789063,4.335938,0],[13.054688,4.40625,0],[13.132813,4.335938,0],[12.929688,4.125,0],[0.501414,7.628906,0.670256],[0.632813,7.628906,0],[-1.070312,7.875,0],[0.429278,7.03125,0.639395],[0.554688,7.03125,0],[-0.162029,6.292969,0.38696],[-0.085937,6.292969,0],[-0.147812,5.625,0.3925],[-0.070312,5.625,0],[0.140489,7.628906,1.210801],[-1.070312,7.875,0],[0.084844,7.03125,1.155156],[-0.370879,6.292969,0.699434],[-0.360312,5.625,0.71],[-0.400056,7.628906,1.571726],[-1.070312,7.875,0],[-0.430918,7.03125,1.49959],[-0.683352,6.292969,0.908284],[-0.677812,5.625,0.9225],[-1.070312,7.628906,1.703125],[-1.070312,7.875,0],[-1.070312,7.03125,1.625],[-1.070312,6.292969,0.984375],[-1.070312,5.625,1],[-1.740569,7.628906,1.571726],[-1.070312,7.628906,1.703125],[-1.070312,7.875,0],[-1.709707,7.03125,1.49959],[-1.070312,7.03125,1.625],[-1.457273,6.292969,0.908284],[-1.070312,6.292969,0.984375],[-1.462812,5.625,0.9225],[-1.070312,5.625,1],[-2.281113,7.628906,1.210801],[-1.070312,7.875,0],[-2.225469,7.03125,1.155156],[-1.769746,6.292969,0.699434],[-1.780312,5.625,0.71],[-2.642038,7.628906,0.670256],[-1.070312,7.875,0],[-2.569902,7.03125,0.639395],[-1.978596,6.292969,0.38696],[-1.992812,5.625,0.3925],[-2.773438,7.628906,0],[-1.070312,7.875,0],[-2.695313,7.03125,0],[-2.054687,6.292969,0],[-2.070312,5.625,0],[-2.642038,7.628906,-0.670256],[-2.773438,7.628906,0],[-1.070312,7.875,0],[-2.569902,7.03125,-0.639395],[-2.695313,7.03125,0],[-1.978596,6.292969,-0.38696],[-2.054687,6.292969,0],[-1.992812,5.625,-0.3925],[-2.070312,5.625,0],[-2.281113,7.628906,-1.210801],[-1.070312,7.875,0],[-2.225469,7.03125,-1.155156],[-1.769746,6.292969,-0.699434],[-1.780312,5.625,-0.71],[-1.740569,7.628906,-1.571726],[-1.070312,7.875,0],[-1.709707,7.03125,-1.49959],[-1.457273,6.292969,-0.908284],[-1.462812,5.625,-0.9225],[-1.070312,7.628906,-1.703125],[-1.070312,7.875,0],[-1.070312,7.03125,-1.625],[-1.070312,6.292969,-0.984375],[-1.070312,5.625,-1],[-0.400056,7.628906,-1.571726],[-1.070312,7.628906,-1.703125],[-1.070312,7.875,0],[-0.430918,7.03125,-1.49959],[-1.070312,7.03125,-1.625],[-0.683352,6.292969,-0.908284],[-1.070312,6.292969,-0.984375],[-0.677812,5.625,-0.9225],[-1.070312,5.625,-1],[0.140489,7.628906,-1.210801],[-1.070312,7.875,0],[0.084844,7.03125,-1.155156],[-0.370879,6.292969,-0.699434],[-0.360312,5.625,-0.71],[0.501414,7.628906,-0.670256],[-1.070312,7.875,0],[0.429278,7.03125,-0.639395],[-0.162029,6.292969,-0.38696],[-0.147812,5.625,-0.3925],[0.632813,7.628906,0],[-1.070312,7.875,0],[0.554688,7.03125,0],[-0.085937,6.292969,0],[-0.070312,5.625,0],[-0.070312,5.625,0],[-0.147812,5.625,0.3925],[1.034141,5.179688,0.895391],[1.210938,5.179688,0],[2.735,4.875,1.619062],[3.054688,4.875,0],[4.262891,4.570313,2.26914],[4.710938,4.570313,0],[4.925938,4.125,2.55125],[5.429688,4.125,0],[-0.360312,5.625,0.71],[0.549375,5.179688,1.619688],[1.858438,4.875,2.92875],[3.034375,4.570313,4.104687],[3.544688,4.125,4.615],[-0.677812,5.625,0.9225],[-0.174922,5.179688,2.104453],[0.54875,4.875,3.805313],[1.198828,4.570313,5.333203],[1.480938,4.125,5.99625],[-1.070312,5.625,1],[-1.070312,5.179688,2.28125],[-1.070312,4.875,4.125],[-1.070312,4.570313,5.78125],[-1.070312,4.125,6.5],[-1.070312,5.625,1],[-1.462812,5.625,0.9225],[-1.965703,5.179688,2.104453],[-1.070312,5.179688,2.28125],[-2.689375,4.875,3.805313],[-1.070312,4.875,4.125],[-3.339453,4.570313,5.333203],[-1.070312,4.570313,5.78125],[-3.621562,4.125,5.99625],[-1.070312,4.125,6.5],[-1.780312,5.625,0.71],[-2.69,5.179688,1.619688],[-3.999062,4.875,2.92875],[-5.174999,4.570313,4.104687],[-5.685312,4.125,4.615],[-1.992812,5.625,0.3925],[-3.174765,5.179688,0.895391],[-4.875625,4.875,1.619062],[-6.403516,4.570313,2.26914],[-7.066563,4.125,2.55125],[-2.070312,5.625,0],[-3.351562,5.179688,0],[-5.195313,4.875,0],[-6.851563,4.570313,0],[-7.570313,4.125,0],[-2.070312,5.625,0],[-1.992812,5.625,-0.3925],[-3.174765,5.179688,-0.895391],[-3.351562,5.179688,0],[-4.875625,4.875,-1.619062],[-5.195313,4.875,0],[-6.403516,4.570313,-2.26914],[-6.851563,4.570313,0],[-7.066563,4.125,-2.55125],[-7.570313,4.125,0],[-1.780312,5.625,-0.71],[-2.69,5.179688,-1.619688],[-3.999062,4.875,-2.92875],[-5.174999,4.570313,-4.104687],[-5.685312,4.125,-4.615],[-1.462812,5.625,-0.9225],[-1.965703,5.179688,-2.104453],[-2.689375,4.875,-3.805313],[-3.339453,4.570313,-5.333203],[-3.621562,4.125,-5.99625],[-1.070312,5.625,-1],[-1.070312,5.179688,-2.28125],[-1.070312,4.875,-4.125],[-1.070312,4.570313,-5.78125],[-1.070312,4.125,-6.5],[-1.070312,5.625,-1],[-0.677812,5.625,-0.9225],[-0.174922,5.179688,-2.104453],[-1.070312,5.179688,-2.28125],[0.54875,4.875,-3.805313],[-1.070312,4.875,-4.125],[1.198828,4.570313,-5.333203],[-1.070312,4.570313,-5.78125],[1.480938,4.125,-5.99625],[-1.070312,4.125,-6.5],[-0.360312,5.625,-0.71],[0.549375,5.179688,-1.619688],[1.858438,4.875,-2.92875],[3.034375,4.570313,-4.104687],[3.544688,4.125,-4.615],[-0.147812,5.625,-0.3925],[1.034141,5.179688,-0.895391],[2.735,4.875,-1.619062],[4.262891,4.570313,-2.26914],[4.925938,4.125,-2.55125],[-0.070312,5.625,0],[1.210938,5.179688,0],[3.054688,4.875,0],[4.710938,4.570313,0],[5.429688,4.125,0]],\"faces\":[[0,1,2],[2,3,0],[3,2,4],[4,5,3],[5,4,6],[6,7,5],[7,6,8],[8,9,7],[1,10,11],[11,2,1],[2,11,12],[12,4,2],[4,12,13],[13,6,4],[6,13,14],[14,8,6],[10,15,16],[16,11,10],[11,16,17],[17,12,11],[12,17,18],[18,13,12],[13,18,19],[19,14,13],[15,20,21],[21,16,15],[16,21,22],[22,17,16],[17,22,23],[23,18,17],[18,23,24],[24,19,18],[25,26,27],[27,28,25],[28,27,29],[29,30,28],[30,29,31],[31,32,30],[32,31,33],[33,34,32],[26,35,36],[36,27,26],[27,36,37],[37,29,27],[29,37,38],[38,31,29],[31,38,39],[39,33,31],[35,40,41],[41,36,35],[36,41,42],[42,37,36],[37,42,43],[43,38,37],[38,43,44],[44,39,38],[40,45,46],[46,41,40],[41,46,47],[47,42,41],[42,47,48],[48,43,42],[43,48,49],[49,44,43],[50,51,52],[52,53,50],[53,52,54],[54,55,53],[55,54,56],[56,57,55],[57,56,58],[58,59,57],[51,60,61],[61,52,51],[52,61,62],[62,54,52],[54,62,63],[63,56,54],[56,63,64],[64,58,56],[60,65,66],[66,61,60],[61,66,67],[67,62,61],[62,67,68],[68,63,62],[63,68,69],[69,64,63],[65,70,71],[71,66,65],[66,71,72],[72,67,66],[67,72,73],[73,68,67],[68,73,74],[74,69,68],[75,76,77],[77,78,75],[78,77,79],[79,80,78],[80,79,81],[81,82,80],[82,81,83],[83,84,82],[76,85,86],[86,77,76],[77,86,87],[87,79,77],[79,87,88],[88,81,79],[81,88,89],[89,83,81],[85,90,91],[91,86,85],[86,91,92],[92,87,86],[87,92,93],[93,88,87],[88,93,94],[94,89,88],[90,95,96],[96,91,90],[91,96,97],[97,92,91],[92,97,98],[98,93,92],[93,98,99],[99,94,93],[100,101,102],[102,103,100],[103,102,104],[104,105,103],[105,104,106],[106,107,105],[107,106,108],[108,109,107],[101,110,111],[111,102,101],[102,111,112],[112,104,102],[104,112,113],[113,106,104],[106,113,114],[114,108,106],[110,115,116],[116,111,110],[111,116,117],[117,112,111],[112,117,118],[118,113,112],[113,118,119],[119,114,113],[115,120,121],[121,116,115],[116,121,122],[122,117,116],[117,122,123],[123,118,117],[118,123,124],[124,119,118],[125,126,127],[127,128,125],[128,127,129],[129,130,128],[130,129,131],[131,132,130],[132,131,133],[133,134,132],[126,135,136],[136,127,126],[127,136,137],[137,129,127],[129,137,138],[138,131,129],[131,138,139],[139,133,131],[135,140,141],[141,136,135],[136,141,142],[142,137,136],[137,142,143],[143,138,137],[138,143,144],[144,139,138],[140,145,146],[146,141,140],[141,146,147],[147,142,141],[142,147,148],[148,143,142],[143,148,149],[149,144,143],[150,151,152],[152,153,150],[153,152,154],[154,155,153],[155,154,156],[156,157,155],[157,156,158],[158,159,157],[151,160,161],[161,152,151],[152,161,162],[162,154,152],[154,162,163],[163,156,154],[156,163,164],[164,158,156],[160,165,166],[166,161,160],[161,166,167],[167,162,161],[162,167,168],[168,163,162],[163,168,169],[169,164,163],[165,170,171],[171,166,165],[166,171,172],[172,167,166],[167,172,173],[173,168,167],[168,173,174],[174,169,168],[175,176,177],[177,178,175],[178,177,179],[179,180,178],[180,179,181],[181,182,180],[182,181,183],[183,184,182],[176,185,186],[186,177,176],[177,186,187],[187,179,177],[179,187,188],[188,181,179],[181,188,189],[189,183,181],[185,190,191],[191,186,185],[186,191,192],[192,187,186],[187,192,193],[193,188,187],[188,193,194],[194,189,188],[190,195,196],[196,191,190],[191,196,197],[197,192,191],[192,197,198],[198,193,192],[193,198,199],[199,194,193],[200,201,202],[202,203,200],[203,202,204],[204,205,203],[205,204,206],[206,207,205],[207,206,208],[208,209,207],[201,210,211],[211,202,201],[202,211,212],[212,204,202],[204,212,213],[213,206,204],[206,213,214],[214,208,206],[210,215,216],[216,211,210],[211,216,217],[217,212,211],[212,217,218],[218,213,212],[213,218,219],[219,214,213],[215,220,221],[221,216,215],[216,221,222],[222,217,216],[217,222,223],[223,218,217],[218,223,224],[224,219,218],[225,226,227],[227,228,225],[228,227,229],[229,230,228],[230,229,231],[231,232,230],[232,231,233],[233,234,232],[226,235,236],[236,227,226],[227,236,237],[237,229,227],[229,237,238],[238,231,229],[231,238,239],[239,233,231],[235,240,241],[241,236,235],[236,241,242],[242,237,236],[237,242,243],[243,238,237],[238,243,244],[244,239,238],[240,245,246],[246,241,240],[241,246,247],[247,242,241],[242,247,248],[248,243,242],[243,248,249],[249,244,243],[250,251,252],[252,253,250],[253,252,254],[254,255,253],[255,254,256],[256,257,255],[257,256,258],[258,259,257],[251,260,261],[261,252,251],[252,261,262],[262,254,252],[254,262,263],[263,256,254],[256,263,264],[264,258,256],[260,265,266],[266,261,260],[261,266,267],[267,262,261],[262,267,268],[268,263,262],[263,268,269],[269,264,263],[265,270,271],[271,266,265],[266,271,272],[272,267,266],[267,272,273],[273,268,267],[268,273,274],[274,269,268],[275,276,277],[277,278,275],[278,277,279],[279,280,278],[280,279,281],[281,282,280],[282,281,283],[283,284,282],[276,285,286],[286,277,276],[277,286,287],[287,279,277],[279,287,288],[288,281,279],[281,288,289],[289,283,281],[285,290,291],[291,286,285],[286,291,292],[292,287,286],[287,292,293],[293,288,287],[288,293,294],[294,289,288],[290,295,296],[296,291,290],[291,296,297],[297,292,291],[292,297,298],[298,293,292],[293,298,299],[299,294,293],[300,301,302],[302,303,300],[303,302,304],[304,305,303],[305,304,306],[306,307,305],[307,306,308],[301,309,310],[310,302,301],[302,310,311],[311,304,302],[304,311,312],[312,306,304],[306,312,313],[309,314,315],[315,310,309],[310,315,316],[316,311,310],[311,316,317],[317,312,311],[312,317,318],[314,319,320],[320,315,314],[315,320,321],[321,316,315],[316,321,322],[322,317,316],[317,322,323],[324,325,326],[326,327,324],[327,326,328],[328,329,327],[329,328,330],[330,331,329],[331,330,332],[325,333,334],[334,326,325],[326,334,335],[335,328,326],[328,335,336],[336,330,328],[330,336,337],[333,338,339],[339,334,333],[334,339,340],[340,335,334],[335,340,341],[341,336,335],[336,341,342],[338,343,344],[344,339,338],[339,344,345],[345,340,339],[340,345,346],[346,341,340],[341,346,347],[348,349,350],[350,351,348],[351,350,352],[352,353,351],[353,352,354],[354,355,353],[355,354,356],[349,357,358],[358,350,349],[350,358,359],[359,352,350],[352,359,360],[360,354,352],[354,360,361],[357,362,363],[363,358,357],[358,363,364],[364,359,358],[359,364,365],[365,360,359],[360,365,366],[362,367,368],[368,363,362],[363,368,369],[369,364,363],[364,369,370],[370,365,364],[365,370,371],[372,373,374],[374,375,372],[375,374,376],[376,377,375],[377,376,378],[378,379,377],[379,378,380],[373,381,382],[382,374,373],[374,382,383],[383,376,374],[376,383,384],[384,378,376],[378,384,385],[381,386,387],[387,382,381],[382,387,388],[388,383,382],[383,388,389],[389,384,383],[384,389,390],[386,391,392],[392,387,386],[387,392,393],[393,388,387],[388,393,394],[394,389,388],[389,394,395],[396,397,398],[398,399,396],[399,398,400],[400,401,399],[401,400,402],[402,403,401],[403,402,404],[404,405,403],[397,406,407],[407,398,397],[398,407,408],[408,400,398],[400,408,409],[409,402,400],[402,409,410],[410,404,402],[406,411,412],[412,407,406],[407,412,413],[413,408,407],[408,413,414],[414,409,408],[409,414,415],[415,410,409],[411,416,417],[417,412,411],[412,417,418],[418,413,412],[413,418,419],[419,414,413],[414,419,420],[420,415,414],[421,422,423],[423,424,421],[424,423,425],[425,426,424],[426,425,427],[427,428,426],[428,427,429],[429,430,428],[422,431,432],[432,423,422],[423,432,433],[433,425,423],[425,433,434],[434,427,425],[427,434,435],[435,429,427],[431,436,437],[437,432,431],[432,437,438],[438,433,432],[433,438,439],[439,434,433],[434,439,440],[440,435,434],[436,441,442],[442,437,436],[437,442,443],[443,438,437],[438,443,444],[444,439,438],[439,444,445],[445,440,439],[446,447,448],[448,449,446],[449,448,450],[450,451,449],[451,450,452],[452,453,451],[453,452,454],[454,455,453],[447,456,457],[457,448,447],[448,457,458],[458,450,448],[450,458,459],[459,452,450],[452,459,460],[460,454,452],[456,461,462],[462,457,456],[457,462,463],[463,458,457],[458,463,464],[464,459,458],[459,464,465],[465,460,459],[461,466,467],[467,462,461],[462,467,468],[468,463,462],[463,468,469],[469,464,463],[464,469,470],[470,465,464],[471,472,473],[473,474,471],[474,473,475],[475,476,474],[476,475,477],[477,478,476],[478,477,479],[479,480,478],[472,481,482],[482,473,472],[473,482,483],[483,475,473],[475,483,484],[484,477,475],[477,484,485],[485,479,477],[481,486,487],[487,482,481],[482,487,488],[488,483,482],[483,488,489],[489,484,483],[484,489,490],[490,485,484],[486,491,492],[492,487,486],[487,492,493],[493,488,487],[488,493,494],[494,489,488],[489,494,495],[495,490,489],[496,497,498],[498,499,496],[499,498,500],[500,501,499],[501,500,502],[502,503,501],[503,502,504],[504,505,503],[497,506,507],[507,498,497],[498,507,508],[508,500,498],[500,508,509],[509,502,500],[502,509,510],[510,504,502],[506,511,512],[512,507,506],[507,512,513],[513,508,507],[508,513,514],[514,509,508],[509,514,515],[515,510,509],[511,516,517],[517,512,511],[512,517,518],[518,513,512],[513,518,519],[519,514,513],[514,519,520],[520,515,514],[521,522,523],[523,524,521],[524,523,525],[525,526,524],[526,525,527],[527,528,526],[528,527,529],[529,530,528],[522,531,532],[532,523,522],[523,532,533],[533,525,523],[525,533,534],[534,527,525],[527,534,535],[535,529,527],[531,536,537],[537,532,531],[532,537,538],[538,533,532],[533,538,539],[539,534,533],[534,539,540],[540,535,534],[536,541,542],[542,537,536],[537,542,543],[543,538,537],[538,543,544],[544,539,538],[539,544,545],[545,540,539],[546,547,548],[548,549,546],[549,548,550],[550,551,549],[551,550,552],[552,553,551],[553,552,554],[554,555,553],[547,556,557],[557,548,547],[548,557,558],[558,550,548],[550,558,559],[559,552,550],[552,559,560],[560,554,552],[556,561,562],[562,557,556],[557,562,563],[563,558,557],[558,563,564],[564,559,558],[559,564,565],[565,560,559],[561,566,567],[567,562,561],[562,567,568],[568,563,562],[563,568,569],[569,564,563],[564,569,570],[570,565,564],[571,572,573],[573,574,571],[574,573,575],[575,576,574],[576,575,577],[577,578,576],[578,577,579],[579,580,578],[572,581,582],[582,573,572],[573,582,583],[583,575,573],[575,583,584],[584,577,575],[577,584,585],[585,579,577],[581,586,587],[587,582,581],[582,587,588],[588,583,582],[583,588,589],[589,584,583],[584,589,590],[590,585,584],[586,591,592],[592,587,586],[587,592,593],[593,588,587],[588,593,594],[594,589,588],[589,594,595],[595,590,589],[596,597,598],[597,596,599],[599,600,597],[600,599,601],[601,602,600],[602,601,603],[603,604,602],[605,596,606],[596,605,607],[607,599,596],[599,607,608],[608,601,599],[601,608,609],[609,603,601],[610,605,611],[605,610,612],[612,607,605],[607,612,613],[613,608,607],[608,613,614],[614,609,608],[615,610,616],[610,615,617],[617,612,610],[612,617,618],[618,613,612],[613,618,619],[619,614,613],[620,621,622],[621,620,623],[623,624,621],[624,623,625],[625,626,624],[626,625,627],[627,628,626],[629,620,630],[620,629,631],[631,623,620],[623,631,632],[632,625,623],[625,632,633],[633,627,625],[634,629,635],[629,634,636],[636,631,629],[631,636,637],[637,632,631],[632,637,638],[638,633,632],[639,634,640],[634,639,641],[641,636,634],[636,641,642],[642,637,636],[637,642,643],[643,638,637],[644,645,646],[645,644,647],[647,648,645],[648,647,649],[649,650,648],[650,649,651],[651,652,650],[653,644,654],[644,653,655],[655,647,644],[647,655,656],[656,649,647],[649,656,657],[657,651,649],[658,653,659],[653,658,660],[660,655,653],[655,660,661],[661,656,655],[656,661,662],[662,657,656],[663,658,664],[658,663,665],[665,660,658],[660,665,666],[666,661,660],[661,666,667],[667,662,661],[668,669,670],[669,668,671],[671,672,669],[672,671,673],[673,674,672],[674,673,675],[675,676,674],[677,668,678],[668,677,679],[679,671,668],[671,679,680],[680,673,671],[673,680,681],[681,675,673],[682,677,683],[677,682,684],[684,679,677],[679,684,685],[685,680,679],[680,685,686],[686,681,680],[687,682,688],[682,687,689],[689,684,682],[684,689,690],[690,685,684],[685,690,691],[691,686,685],[692,693,694],[694,695,692],[695,694,696],[696,697,695],[697,696,698],[698,699,697],[699,698,700],[700,701,699],[693,702,703],[703,694,693],[694,703,704],[704,696,694],[696,704,705],[705,698,696],[698,705,706],[706,700,698],[702,707,708],[708,703,702],[703,708,709],[709,704,703],[704,709,710],[710,705,704],[705,710,711],[711,706,705],[707,712,713],[713,708,707],[708,713,714],[714,709,708],[709,714,715],[715,710,709],[710,715,716],[716,711,710],[717,718,719],[719,720,717],[720,719,721],[721,722,720],[722,721,723],[723,724,722],[724,723,725],[725,726,724],[718,727,728],[728,719,718],[719,728,729],[729,721,719],[721,729,730],[730,723,721],[723,730,731],[731,725,723],[727,732,733],[733,728,727],[728,733,734],[734,729,728],[729,734,735],[735,730,729],[730,735,736],[736,731,730],[732,737,738],[738,733,732],[733,738,739],[739,734,733],[734,739,740],[740,735,734],[735,740,741],[741,736,735],[742,743,744],[744,745,742],[745,744,746],[746,747,745],[747,746,748],[748,749,747],[749,748,750],[750,751,749],[743,752,753],[753,744,743],[744,753,754],[754,746,744],[746,754,755],[755,748,746],[748,755,756],[756,750,748],[752,757,758],[758,753,752],[753,758,759],[759,754,753],[754,759,760],[760,755,754],[755,760,761],[761,756,755],[757,762,763],[763,758,757],[758,763,764],[764,759,758],[759,764,765],[765,760,759],[760,765,766],[766,761,760],[767,768,769],[769,770,767],[770,769,771],[771,772,770],[772,771,773],[773,774,772],[774,773,775],[775,776,774],[768,777,778],[778,769,768],[769,778,779],[779,771,769],[771,779,780],[780,773,771],[773,780,781],[781,775,773],[777,782,783],[783,778,777],[778,783,784],[784,779,778],[779,784,785],[785,780,779],[780,785,786],[786,781,780],[782,787,788],[788,783,782],[783,788,789],[789,784,783],[784,789,790],[790,785,784],[785,790,791],[791,786,785]]}\n"
  },
  {
    "path": "Resources/surfacenets.js",
    "content": "/**\n * SurfaceNets in JavaScript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * MIT License\n *\n * Based on: S.F. Gibson, \"Constrained Elastic Surface Nets\". (1998) MERL Tech Report.\n */\n \nvar SurfaceNets = {};\n(function(exports) {\n\"use strict\";\n\n//Precompute edge table, like Paul Bourke does.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array(24)\n  , edge_table = new Int32Array(256);\n(function() {\n\n  //Initialize the cube_edges table\n  // This is just the vertex number of each cube\n  var k = 0;\n  for(var i=0; i<8; ++i) {\n    for(var j=1; j<=4; j<<=1) {\n      var p = i^j;\n      if(i <= p) {\n        cube_edges[k++] = i;\n        cube_edges[k++] = p;\n      }\n    }\n  }\n\n  //Initialize the intersection table.\n  //  This is a 2^(cube configuration) ->  2^(edge configuration) map\n  //  There is one entry for each possible cube configuration, and the output is a 12-bit vector enumerating all edges crossing the 0-level.\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer, this may get resized at run time\nvar buffer = new Array(4096);\n(function() {\n  for(var i=0; i<buffer.length; ++i) {\n    buffer[i] = 0;\n  }\n})();\n\n//Export function\nexports.isocontour = function(data, dims) {\n  \n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = [0, 0, 0]\n    , R = [1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)]\n    , grid = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    var ol = buffer.length;\n    buffer.length = R[2] * 2;\n    while(ol < buffer.length) {\n      buffer[ol++] = 0;\n    }\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n  \n    //m is the pointer into the buffer we are going to use.  \n    //This is slightly obtuse because javascript does not have good support for packed data structures, so we must use typed arrays :(\n    //The contents of the buffer will be the indices of the vertices on the previous x/y slice of the volume\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    \n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in 8 field values around this vertex and store them in an array\n      //Also calculate 8-bit mask, like in marching cubes, so we can speed up sign checks later\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check for early termination if cell does not intersect boundary\n      if(mask === 0 || mask === 0xff) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var edge_mask = edge_table[mask]\n        , v = [0.0,0.0,0.0]\n        , e_count = 0;\n        \n      //For every edge of the cube...\n      for(var i=0; i<12; ++i) {\n      \n        //Use edge mask to check if it is crossed\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        \n        //If it did, increment number of edge crossings\n        ++e_count;\n        \n        //Now find the point of intersection\n        var e0 = cube_edges[ i<<1 ]       //Unpack vertices\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]                 //Unpack grid values\n          , g1 = grid[e1]\n          , t  = g0 - g1;                 //Compute point of intersection\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        \n        //Interpolate vertices and add up intersections (this can be done without multiplying)\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k\n            , b = e1 & k;\n          if(a !== b) {\n            v[j] += a ? 1.0 - t : t;\n          } else {\n            v[j] += a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Now we just average the edge intersections and add them to coordinate\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      \n      //Add vertex to buffer, store pointer to vertex index in buffer\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Now we need to add faces together, to do this we just loop over 3 basis components\n      for(var i=0; i<3; ++i) {\n        //The first three entries of the edge_mask count the crossings along the edge\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        \n        // i = axes we are point along.  iu, iv = orthogonal axes\n        var iu = (i+1)%3\n          , iv = (i+2)%3;\n          \n        //If we are on a boundary, skip it\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        \n        //Otherwise, look up adjacent edges in buffer\n        var du = R[iu]\n          , dv = R[iv];\n        \n        //Remember to flip orientation depending on the sign of the corner.\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  \n  //All done!  Return the result\n  return { positions: vertices, faces: faces };\n};\n})(typeof(exports) !== \"undefined\" ? exports : SurfaceNets);\n"
  },
  {
    "path": "Resources/tools/convert_obj.js",
    "content": "//Convert .obj file to JSON\nvar fs = require('fs');\nvar obj = fs.readFileSync(process.argv[2], 'utf8');\n\nvar lines = obj.split('\\n');\n\nvar positions = [];\nvar faces = [];\n\nfor(var i=0; i<lines.length; ++i) {\n\n  var l = lines[i].split(' ');\n  \n  if(l[0] === 'v') {\n    var p = new Array(3);\n    for(var j=0; j<3; ++j) {\n      p[j] = parseFloat(l[j+1]);\n    }\n    positions.push(p);\n  } else if (l[0] === 'f') {\n    var f = new Array(3);\n    for(var j=0; j<3; ++j) {\n      f[j] = parseInt(l[j+1].split('/')[0] - 1);\n    }\n    faces.push(f);\n  }\n}\n\nconsole.log(JSON.stringify({\n    positions: positions\n  , faces: faces\n}));\n\n"
  },
  {
    "path": "ShapeCarving/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ShapeCarving/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "ShapeCarving/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n.resinput {\n  width: 40px;\n}\n.editCanvas {\n  width: 96px;\n  height: 96px;\n}\n\n"
  },
  {
    "path": "ShapeCarving/experiments.txt",
    "content": "node benchmark.js ./stupid.js 32 10 20\n0     6.95       0      0\n1  2733.65 3293184 823296\n2  2848.05 3292128 823032\n3  2727.35 3293184 823296\n4  2673.4  3289032 822258\n5  2729.5  3293184 823296\n6  2741.1  3293088 823272\n7  2687.75 3293184 823296\n8  2729.2  3286512 821628\n9  2682.4  3293184 823296\n10 2772.95 3293136 823284\n\n\n\nnode benchmark.js ./culled.js 32 10 20\n0, 81.8, 0, 0\n1, 129.05, 82488, 20622\n2, 147.85, 114696, 28674\n3, 166.5, 146016, 36504\n4, 180.8, 178792, 44698\n5, 206.1, 209256, 52314\n6, 208.45, 243672, 60918\n7, 258.85, 272304, 68076\n8, 267.6, 306640, 76660\n9, 278.45, 334968, 83742\n10, 297.15, 371496, 92874\n\n\nnode benchmark.js ./greedy.js 32 10 20\n0, 92.4, 0, 0\n1, 99.1, 20712, 5178\n2, 103.1, 44068, 11017\n3, 110.35, 61644, 15411\n4, 126, 87984, 21996\n5, 134.25, 102024, 25506\n6, 151.4, 129344, 32336\n7, 153.6, 142416, 35604\n8, 167.85, 172140, 43035\n9, 164.9, 182256, 45564\n10, 198.3, 213452, 53363\n\nnode benchmark.js ./monotone.js 32 10 20\n0, 203.8, 0, 0\n1, 221.55, 25372, 19563\n2, 234.6, 45462, 28410\n3, 261.3, 67574, 43233\n4, 283.85, 88570, 55712\n5, 302.6, 110558, 69507\n6, 332.2, 134578, 84174\n7, 355.4, 155760, 97736\n8, 373.3, 174672, 111557\n9, 400.75, 199214, 125565\n10, 437.5, 226628, 143088\n\n"
  },
  {
    "path": "ShapeCarving/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>Shape Carving Editor</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n    <script src=\"jscolor/jscolor.js\"></script>\n\n    <!--Mesh algorithms-->\n    <script src=\"js/greedy.js\"></script>\n    <script src=\"js/shapecarve.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tShape Carving Editor\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n      <table>\n        <tr>\n          <td> Front: <input type=\"checkbox\" id=\"frontSelect\" /> </td>\n          <td> Back: <input type=\"checkbox\" id=\"backSelect\" /> </td>\n        </tr>\n        <tr>\n          <td> <canvas id=\"frontCanvas\" class=\"editCanvas\" > </canvas> </td>\n          <td> <canvas id=\"backCanvas\" class=\"editCanvas\" > </canvas> </td>\n        </tr>\n        <tr>\n          <td> Top: <input type=\"checkbox\" id=\"topSelect\" /> </td>\n          <td> Bottom: <input type=\"checkbox\" id=\"bottomSelect\" /> </td>\n        </tr>\n        <tr>\n          <td> <canvas id=\"topCanvas\" class=\"editCanvas\" > </canvas> </td>\n          <td> <canvas id=\"bottomCanvas\" class=\"editCanvas\" > </canvas> </td>\n        </tr>\n        <tr>\n          <td> Left: <input type=\"checkbox\" id=\"leftSelect\" /> </td>\n          <td> Right: <input type=\"checkbox\" id=\"rightSelect\" /> </td>\n        </tr>\n        <tr>\n          <td> <canvas id=\"leftCanvas\" class=\"editCanvas\" > </canvas> </td>\n          <td> <canvas id=\"rightCanvas\" class=\"editCanvas\" > </canvas> </td>\n        </tr>\n      </table>\n      <p> Paint: <input class=\"color\" id=\"paintColor\" value=\"ffffff\"/> </p>\n      <p> <input type=\"button\" id=\"clearSelected\" value=\"Clear Selected\" />  Show Guides: <input type=\"checkbox\" id=\"showGuides\" checked=\"checked\" /> </p>\n      <p>\n        <input type=\"button\" id=\"saveImage\" value=\"Save Image\" />\n        <input type=\"button\" id=\"loadImage\" value=\"Load Image\" />\n        <input type=\"button\" id=\"exportMesh\" value=\"Export Mesh\" />\n      </p>\n\t  </div>\n\t</div>\n\t\n\t<script type=\"text/javascript\">\n(function() {\nvar stats, scene, renderer, composer;\nvar camera, cameraControl;\nvar mask_color = 0;\nvar geometry, surfacemesh, mesher = GreedyMesh;\nvar view_names = [  \"leftCanvas\"\n                  , \"rightCanvas\"\n                  , \"topCanvas\"\n                  , \"bottomCanvas\"\n                  , \"frontCanvas\"\n                  , \"backCanvas\" ];\nvar select_names = [ \"leftSelect\"\n                  , \"rightSelect\"\n                  , \"topSelect\"\n                  , \"bottomSelect\"\n                  , \"frontSelect\"\n                  , \"backSelect\" ];\n\nvar buffer_xform = [\n  [ 0, 1,\n    1, 0],\n  [ 0, 1,\n    1, 0],\n  [ 1, 0,\n    0, 1],\n  [ 1, 0,\n    0, 1],\n  [ 1, 0,\n    0, 1],\n  [ 1, 0,\n    0, 1]    \n];\nvar view_data = [];\nvar dims = new Int32Array([16, 16, 16])\n  , image_scale = 6\n  , loadImage\n  , clearSelected\n  , fullRepaint;\n\n//Unpack query string arguments\nvar query_arguments = (function() {\n  var query = window.location.search.substring(1)\n    , result = {}\n    , toks = query.split(\"&\");\n  for(var i=0; i<toks.length; ++i) {\n    var pair = toks[i].split('=');\n    result[unescape(pair[0])] = unescape(pair[1]);\n  }\n  return result;\n})();\n\n//Save-As feature\nwindow.saveAs = window.saveAs \n  || window.webkitSaveAs \n  || window.mozSaveAs \n  || window.msSaveAs \n  || window.open;\n\n\nfunction initializeCanvases() {\n  var repaint_handlers = []\n    , contexts = []\n    , canvases = [];\n\n  var current_mouse = [-1,-1,-1]\n    , mouse_box = new THREE.Mesh(new THREE.CubeGeometry(1,1,1)\n                    , new THREE.MeshBasicMaterial({\n                          color: 0xff0000\n                        , wireframe: true\n                    }));\n  \n  scene.add(mouse_box);\n  mouse_box.visible = false;\n  \n  function updateMouse(nmouse) {\n  \n    //Check for update\n    if(nmouse) {\n      var nochange = true;\n      for(var i=0; i<3; ++i) {\n        if(current_mouse[i] != nmouse[i]) {\n          nochange = false;\n          break;\n        }\n      }\n      current_mouse[0] = nmouse[0];\n      current_mouse[1] = nmouse[1];\n      current_mouse[2] = nmouse[2];\n      if(nochange) {\n        return;\n      }\n    }\n\n    //Repaint screen     \n    for(var i=0; i<6; ++i) {\n      contexts[i].fillStyle = '#ffffff';\n      contexts[i].fillRect(0, 0, canvases[i].width, canvases[i].height);\n    }\n    \n    if(current_mouse[0] < 0) {\n      for(var i=0; i<6; ++i) {\n        repaint_handlers[i]();\n      }\n      mouse_box.visible = false;\n      return;\n    }\n    \n    var mat = buffer_xform[current_mouse[2]]\n      , ray = [-1,-1,-1]\n      , u = ((current_mouse[2]>>1)+1)%3\n      , v = ((current_mouse[2]>>1)+2)%3;\n    ray[u] = mat[0] * current_mouse[0] + mat[2] * current_mouse[1];\n    ray[v] = mat[1] * current_mouse[0] + mat[3] * current_mouse[1];\n    \n    for(var i=0; i<6; ++i) {      \n      \n      //Draw box\n      var Q = buffer_xform[i];\n      var ctx = contexts[i];\n      ctx.fillStyle = '#FF0000';\n      var a = ((i>>1)+1)%3\n        , b = ((i>>1)+2)%3\n        , iu = Q[0] * ray[a] + Q[1] * ray[b]\n        , iv = Q[2] * ray[a] + Q[3] * ray[b];\n      ctx.fillRect( iu<0 ? 0 : iu*image_scale\n                  , iv<0 ? 0 : iv*image_scale\n                  , iu<0 ? dims[a]*image_scale+1 : image_scale+1\n                  , iv<0 ? dims[b]*image_scale+1 : image_scale+1);\n    }\n    \n    for(var i=0; i<6; ++i) {\n      repaint_handlers[i]();\n    }\n    \n    \n    mouse_box.scale.x = ray[0]<0 ? dims[0] : 1;\n    mouse_box.scale.y = ray[1]<0 ? dims[1] : 1;\n    mouse_box.scale.z = ray[2]<0 ? dims[2] : 1;\n    \n    mouse_box.position.x = (ray[0]>=0 ? ray[0] - dims[0]/2 + 0.5: 0);\n    mouse_box.position.y = (ray[1]>=0 ? ray[1] - dims[1]/2 + 0.5: 0);\n    mouse_box.position.z = (ray[2]>=0 ? ray[2] - dims[2]/2 + 0.5: 0);\n    \n    mouse_box.visible = true;\n  }\n\n  for(var i=0; i<6; ++i) \n  (function() {\n    var d = i >> 1\n      , u = (d+1) % 3\n      , v = (d+2) % 3\n      , mat = buffer_xform[i]\n      , canvas = document.getElementById(view_names[i]);\n    canvas.width = dims[u] * image_scale + 1;\n    canvas.height = dims[v] * image_scale + 1;\n    canvases.push(canvas);\n    \n    var index = i;\n    \n    //Create view data buffer\n    var buffer = new Int32Array(dims[u] * dims[v]);\n    for(var j=0; j<buffer.length; ++j) {\n      buffer[j] = mask_color;\n    }\n    view_data.push(buffer);\n\n    //Initialize context\n    var ctx = canvas.getContext(\"2d\");\n    contexts.push(ctx);\n    \n    //Do repaint\n    function repaint() {\n      for(var j=0, n=0; j<dims[v]; ++j)\n      for(var k=0; k<dims[u]; ++k) {\n        var a = mat[0] * k + mat[1] * j\n          , b = mat[2] * k + mat[3] * j\n          , c = buffer[a + b * dims[u]];\n      \n        ctx.fillStyle = 'rgb(' + ((c>>16)&0xff) + ',' + ((c>>8)&0xff) + ',' + (c&0xff) + ')';\n        ctx.fillRect(k*image_scale+1, j*image_scale+1, image_scale-1, image_scale-1);\n      }\n    };\n    repaint();\n    repaint_handlers.push(repaint);\n    \n    \n    function mouseHandler(ev) {\n      var x = ev.offsetX\n        , y = ev.offsetY        \n        , ix = Math.floor((x-1) / image_scale)\n        , iy = Math.floor((y-1) / image_scale)\n        , a = mat[0] * ix + mat[1] * iy\n        , b = mat[2] * ix + mat[3] * iy\n        , idx = a + b * dims[u];\n      \n      if(ix < 0 || iy < 0) {\n        updateMouse([-1,-1,-1]);\n        return;\n      }\n      \n      if(ev.which & 1) {\n        var paint_color = document.getElementById(\"paintColor\").value\n          , paint_value = parseInt(paint_color, 16)\n        if(buffer[idx] !== paint_value) {\n          buffer[idx] = paint_value;\n          ctx.fillStyle = '#' + paint_color;\n          ctx.fillRect(ix*image_scale+1, iy*image_scale+1, image_scale-1, image_scale-1);\n          updateMesh();\n        }\n      }\n      if(ev.which & 2) {\n        var c = buffer[idx];\n        document.getElementById(\"paintColor\").color.fromRGB(((c>>16)&0xff)/255.0, ((c>>8)&0xff)/255.0, (c&0xff)/255.0);\n        return true;\n      }\n      \n      updateMouse([ix, iy, index]);\n    }\n    canvas.addEventListener('mousemove', mouseHandler, false);\n    canvas.addEventListener('mousedown', mouseHandler, false);\n    canvas.addEventListener('mouseleave', function() {\n      updateMouse([-1,-1,-1]);\n    }, false);\n    canvas.addEventListener('mouseout', function() {\n      updateMouse([-1,-1,-1]);\n    }, false);    \n  })();\n  \n  \n  //Initialize save/load buffer\n  var buf_width = 0\n    , buf_height = dims[0] + dims[1] + dims[2];\n  for(var i=0; i<3; ++i) {\n    buf_width = Math.max(buf_width, 2*dims[(i+1)%3]);\n  }\n  \n  //Create a hidden save buffer\n  var save_buffer = document.createElement(\"canvas\");\n  save_buffer.style.visibility = \"hidden\";\n  save_buffer.width = buf_width;\n  save_buffer.height = buf_height;\n  var save_context = save_buffer.getContext(\"2d\");\n  \n  document.getElementById(\"saveImage\").addEventListener('click', function() {\n  \n    //Unpack buffers into image\n    var save_image = save_context.getImageData(0, 0, buf_width, buf_height);\n    var row_start = 0;\n    for(var d=0; d<3; ++d) {\n      var u = (d+1)%3\n        , v = (d+2)%3;\n      for(var s=0; s<2; ++s) {\n        var buffer = view_data[2*d+s]\n          , n = 0;\n        for(var i=0, row=row_start; i<dims[v]; ++i, ++row)\n        for(var j=0, col=s*dims[u]; j<dims[u]; ++j, ++col, ++n) {\n          var idx = 4*(col + row*buf_width);\n          for(var c=0; c<3; ++c) {\n            save_image.data[idx+2-c] = (buffer[n]>>(c*8))&0xff;\n          }\n          save_image.data[idx+3] = 0xff;\n        }\n      }\n      row_start += dims[u];\n    }\n    //Save image\n    save_context.putImageData(save_image, 0, 0);\n    window.saveAs(save_buffer.toDataURL());\n  }, false);\n  \n  fullRepaint = function() {\n    updateMouse();\n    updateMesh();\n  };\n  \n  //Called when an image loads\n  loadImage = function(url) {\n    if(url.charAt(url.length - 1) === '/') {\n      url = url.substring(0, url.length-1);\n    }\n    var img = new Image();\n    img.src = url;\n    img.onload = function() {\n      save_context.drawImage(img, 0, 0, buf_width, buf_height);\n      //Unpack pixels\n      var save_image = save_context.getImageData(0, 0, buf_width, buf_height)\n        , row_start = 0;\n      for(var d=0; d<3; ++d) {\n        var u = (d+1)%3\n          , v = (d+2)%3;\n        for(var s=0; s<2; ++s) {\n          var buffer = view_data[2*d+s]\n            , n = 0;\n          for(var i=0, row=row_start; i<dims[v]; ++i, ++row)\n          for(var j=0, col=s*dims[u]; j<dims[u]; ++j, ++col, ++n) {\n            var idx = 4*(col + row*buf_width)\n              , value = 0;\n            for(var c=0; c<3; ++c) {\n              value = (value<<8)|save_image.data[idx+c];\n            }\n            buffer[n] = value;\n          }\n        }\n        row_start += dims[u];\n      }\n      fullRepaint();\n    }\n  }\n  \n  \n  clearSelected = function() {\n    var bitmask = [];\n    for(var i=0; i<6; ++i) {\n      bitmask.push(document.getElementById(select_names[i]).checked);\n    }\n    \n    //Compute new volume from partial views\n    var volume = ShapeCarve(\n          dims\n        , view_data\n        , mask_color\n        , bitmask).volume;\n    \n    //Update images\n    var x = [0,0,0];\n    for(var d=0; d<3; ++d)\n    for(var s=0; s<2; ++s) {\n      var vnum = 2*d+s;\n      if(bitmask[vnum]) {\n        var u = (d+1)%3\n          , v = (d+2)%3\n          , n = 0\n          , aview = view_data[vnum];\n        for(x[v]=0; x[v]<dims[v]; ++x[v])\n        for(x[u]=0; x[u]<dims[u]; ++x[u], ++n) {\n          var start = 0\n            , step = 1;\n          if(!!s) {\n            start = dims[d]-1;\n            step = -1;\n          }\n          aview[n] = mask_color;\n          for(x[d]=start; 0<=x[d] && x[d]<dims[d]; x[d]+=step) {\n            var c = volume[x[0] + dims[0] * (x[1] + dims[1] * x[2])];\n            if(c !== mask_color && c !== 0xff00ff) {\n              aview[n] = c;\n              break;\n            }\n          }\n        }\n      }\n    }\n    \n    //Redraw mesh and edit panes\n    fullRepaint();\n  };\n}\n\n\n\nfunction updateMesh() {\n\n  if(surfacemesh) {\n    scene.remove( surfacemesh );\n  }\n  \n  geometry\t= new THREE.Geometry();\t\t\n\n  //Run shape carving1\n  var volume = ShapeCarve(\n        dims\n      , view_data\n      , mask_color\n      , [ false, false, false, false, false, false ] )\n    , result = GreedyMesh(volume.volume, volume.dims);\n\n  geometry.vertices.length = 0;\n  geometry.faces.length = 0;\n  for(var i=0; i<result.vertices.length; ++i) {\n    var q = result.vertices[i];\n    geometry.vertices.push(new THREE.Vector3(q[0], q[1], q[2]));\n  }\n  for(var i=0; i<result.faces.length; ++i) {\n    var q = result.faces[i];\n    if(q.length === 5) {\n      var f = new THREE.Face4(q[0], q[1], q[2], q[3]);\n      f.color = new THREE.Color(q[4]);\n      f.vertexColors = [f.color,f.color,f.color,f.color];\n      geometry.faces.push(f);\n    } else if(q.length == 4) {\n      var f = new THREE.Face3(q[0], q[1], q[2]);\n      f.color = new THREE.Color(q[3]);\n      f.vertexColors = [f.color,f.color,f.color];\n      geometry.faces.push(f);\n    }\n  }\n  \n  geometry.verticesNeedUpdate = true;\n  geometry.elementsNeedUpdate = true;\n  \n   //Create surface mesh\n  var material\t= new THREE.MeshBasicMaterial({\n      color: 0xffffff \n    , vertexColors: THREE.VertexColors\n    , shading: THREE.FlatShading\n  });\n  surfacemesh\t= new THREE.Mesh( geometry, material );\n  surfacemesh.doubleSided = false;\n\n  surfacemesh.position.x = -dims[0] / 2.0;\n  surfacemesh.position.y = -dims[1] / 2.0;\n  surfacemesh.position.z = -dims[2] / 2.0;\n  \n  scene.add( surfacemesh );\n}\n\nif( !init() )\tanimate();\n\n// init the scene\nfunction init(){\n\t\n\tif( Detector.webgl ){\n\t  renderer = new THREE.WebGLRenderer({\n\t\t  antialias\t\t: true,\t// to get smoother output\n\t\t  preserveDrawingBuffer\t: true\t// to allow screenshot\n\t  });\n  }else{\n    renderer = new THREE.CanvasRenderer();\n  }\n  renderer.setClearColorHex( 0xBBBBBB, 1 );\n\n\n  renderer.setSize( window.innerWidth, window.innerHeight );\n  document.getElementById('container').appendChild(renderer.domElement);\n\n  // add Stats.js - https://github.com/mrdoob/stats.js\n  stats = new Stats();\n  stats.domElement.style.position\t= 'absolute';\n  stats.domElement.style.top\t= '0px';\n  stats.domElement.style.right = '0px';\n  document.body.appendChild( stats.domElement );\n\n  // create a scene\n  scene = new THREE.Scene();\n\n  // put a camera in the scene\n  camera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n  camera.position.set(0, 0, -40);\n  scene.add(camera);\n\n  // create a camera contol\n  cameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n  // transparently support window resize\n  THREEx.WindowResize.bind(renderer, camera);\n  // allow 'p' to make screenshot\n  THREEx.Screenshot.bindKey(renderer);\n  // allow 'f' to go fullscreen where this feature is supported\n  if( THREEx.FullScreen.available() ){\n\t  THREEx.FullScreen.bindKey();\t\t\n\t  document.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n  }\n\n  //Handle larger images optionally\n  if('nx' in query_arguments) {\n    dims[0] = parseInt(query_arguments['nx']);\n  }\n  if('ny' in query_arguments) {\n    dims[1] = parseInt(query_arguments['ny']);\n  }\n  if('ny' in query_arguments) {\n    dims[2] = parseInt(query_arguments['nz']);\n  }\n  \n  //Initialize canvases\n  initializeCanvases();\n\n  if('src' in query_arguments) {\n    loadImage(query_arguments['src']);\n  }\n  \n  updateMesh();\n  \n  document.getElementById(\"clearSelected\").addEventListener(\"click\", clearSelected, false);\n\n  return false;\n}\n\n// animation loop\nfunction animate() {\n\n  // loop on request animation loop\n  // - it has to be at the begining of the function\n  // - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n  requestAnimationFrame( animate );\n\n  // do the render\n  render();\n\n  // update stats\n  stats.update();\n}\n\n// render the scene\nfunction render() {\n  // variable which is increase by Math.PI every seconds - usefull for animation\n  var PIseconds\t= Date.now() * Math.PI;\n\n  // update camera controls\n  cameraControls.update();\n\n  // actually render the scene\n  renderer.render( scene, camera );\n}\n})();\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "ShapeCarving/js/benchmark.js",
    "content": "var mesher = require(process.argv[2]).mesher\n  , res = parseInt(process.argv[3])\n  , max_freq = parseInt(process.argv[4])\n  , iter_count = parseInt(process.argv[5]);\n\nvar nr = 2*res + 1\n  , volume = new Int32Array(nr * nr * nr)\n  , dims   = new Int32Array([nr, nr, nr]);\n\nfunction init_volume(freq) {\n  var n = 0, s = 0.5 * freq * Math.PI / res;\n  for(var z=-res; z<=res; ++z)\n  for(var y=-res; y<=res; ++y)\n  for(var x=-res; x<=res; ++x, ++n) {\n    volume[n] = Math.sin(s * x) + Math.sin(s * y) + Math.sin(s * z) < 0 ? 1 : 0;\n  }\n}\n\n//Warm up run on noisy volume, try to get JIT to compile meser\ninit_volume(res / 4.0);\nfor(var i=0; i<iter_count; ++i) {\n  mesher(volume, dims);\n}\n\n//Do iterations\nfor(var f = 0; f <= max_freq; ++f) {\n  init_volume(f);\n  var start = (new Date()).getTime();\n  for(var i=0; i<iter_count; ++i) {\n    mesher(volume, dims);\n  }\n  var end = (new Date()).getTime();\n  var mesh = mesher(volume, dims);\n  console.log(f + \", \" + ((end-start) / iter_count) + \", \" + mesh.vertices.length + \", \" + mesh.faces.length);  \n}\n\n"
  },
  {
    "path": "ShapeCarving/js/culled.js",
    "content": "//Naive meshing (with face culling)\nfunction CulledMesh(volume, dims) {\n  //Precalculate direction vectors for convenience\n  var dir = new Array(3);\n  for(var i=0; i<3; ++i) {\n    dir[i] = [[0,0,0], [0,0,0]];\n    dir[i][0][(i+1)%3] = 1;\n    dir[i][1][(i+2)%3] = 1;\n  }\n  //March over the volume\n  var vertices = []\n    , faces = []\n    , x = [0,0,0]\n    , B = [[false,true]    //Incrementally update bounds (this is a bit ugly)\n          ,[false,true]\n          ,[false,true]]\n    , n = -dims[0]*dims[1];\n  for(           B[2]=[false,true],x[2]=-1; x[2]<dims[2]; B[2]=[true,(++x[2]<dims[2]-1)])\n  for(n-=dims[0],B[1]=[false,true],x[1]=-1; x[1]<dims[1]; B[1]=[true,(++x[1]<dims[1]-1)])\n  for(n-=1,      B[0]=[false,true],x[0]=-1; x[0]<dims[0]; B[0]=[true,(++x[0]<dims[0]-1)], ++n) {\n    //Read current voxel and 3 neighboring voxels using bounds check results\n    var p =   (B[0][0] && B[1][0] && B[2][0]) ? volume[n]                 : 0\n      , b = [ (B[0][1] && B[1][0] && B[2][0]) ? volume[n+1]               : 0\n            , (B[0][0] && B[1][1] && B[2][0]) ? volume[n+dims[0]]         : 0\n            , (B[0][0] && B[1][0] && B[2][1]) ? volume[n+dims[0]*dims[1]] : 0\n          ];\n    //Generate faces\n    for(var d=0; d<3; ++d)\n    if((!!p) !== (!!b[d])) {\n      var s = !p ? 1 : 0;\n      var t = [x[0],x[1],x[2]]\n        , u = dir[d][s]\n        , v = dir[d][s^1];\n      ++t[d];\n      \n      var vertex_count = vertices.length;\n      vertices.push([t[0],           t[1],           t[2]          ]);\n      vertices.push([t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]);\n      vertices.push([t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]);\n      vertices.push([t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]);\n      faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, s ? b[d] : p]);\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n\n\nif(exports) {\n  exports.mesher = CulledMesh;\n}\n"
  },
  {
    "path": "ShapeCarving/js/greedy.js",
    "content": "var GreedyMesh = (function() {\n//Cache buffer internally\nvar mask = new Int32Array(4096);\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k, l, w, h\n      , u = (d+1)%3\n      , v = (d+2)%3\n      , x = [0,0,0]\n      , q = [0,0,0];\n    if(mask.length < dims[u] * dims[v]) {\n      mask = new Int32Array(dims[u] * dims[v]);\n    }\n    q[d] = 1;\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      //Compute mask\n      var n = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v])\n      for(x[u]=0; x[u]<dims[u]; ++x[u], ++n) {\n        var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n          , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n        if((!!a) === (!!b) ) {\n          mask[n] = 0;\n        } else if(!!a) {\n          mask[n] = a;\n        } else {\n          mask[n] = -b;\n        }\n      }\n      //Increment x[d]\n      ++x[d];\n      //Generate mesh for mask using lexicographic ordering\n      n = 0;\n      for(j=0; j<dims[v]; ++j)\n      for(i=0; i<dims[u]; ) {\n        var c = mask[n];\n        if(!!c) {\n          //Compute width\n          for(w=1; c === mask[n+w] && i+w<dims[u]; ++w) {\n          }\n          //Compute height (this is slightly awkward\n          var done = false;\n          for(h=1; j+h<dims[v]; ++h) {\n            for(k=0; k<w; ++k) {\n              if(c !== mask[n+k+h*dims[u]]) {\n                done = true;\n                break;\n              }\n            }\n            if(done) {\n              break;\n            }\n          }\n          //Add quad\n          x[u] = i;  x[v] = j;\n          var du = [0,0,0]\n            , dv = [0,0,0]; \n          if(c > 0) {\n            dv[v] = h;\n            du[u] = w;\n          } else {\n            c = -c;\n            du[v] = h;\n            dv[u] = w;\n          }\n          var vertex_count = vertices.length;\n          vertices.push([x[0],             x[1],             x[2]            ]);\n          vertices.push([x[0]+du[0],       x[1]+du[1],       x[2]+du[2]      ]);\n          vertices.push([x[0]+du[0]+dv[0], x[1]+du[1]+dv[1], x[2]+du[2]+dv[2]]);\n          vertices.push([x[0]      +dv[0], x[1]      +dv[1], x[2]      +dv[2]]);\n          faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, c]);\n          \n          //Zero-out mask\n          for(l=0; l<h; ++l)\n          for(k=0; k<w; ++k) {\n            mask[n+k+l*dims[u]] = 0;\n          }\n          //Increment counters and continue\n          i += w; n += w;\n        } else {\n          ++i;    ++n;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\n"
  },
  {
    "path": "ShapeCarving/js/greedy_tri.js",
    "content": "var GreedyMesh = (function() {\n//Cache buffer internally\nvar mask = new Int32Array(4096);\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k, l, w, h\n      , u = (d+1)%3\n      , v = (d+2)%3\n      , x = [0,0,0]\n      , q = [0,0,0];\n    if(mask.length < dims[u] * dims[v]) {\n      mask = new Int32Array(dims[u] * dims[v]);\n    }\n    q[d] = 1;\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      //Compute mask\n      var n = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v])\n      for(x[u]=0; x[u]<dims[u]; ++x[u], ++n) {\n        var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n          , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n        if((!!a) === (!!b) ) {\n          mask[n] = 0;\n        } else if(!!a) {\n          mask[n] = a;\n        } else {\n          mask[n] = -b;\n        }\n      }\n      //Increment x[d]\n      ++x[d];\n      //Generate mesh for mask using lexicographic ordering\n      n = 0;\n      for(j=0; j<dims[v]; ++j)\n      for(i=0; i<dims[u]; ) {\n        var c = mask[n];\n        if(!!c) {\n          //Compute width\n          for(w=1; c === mask[n+w] && i+w<dims[u]; ++w) {\n          }\n          //Compute height (this is slightly awkward\n          var done = false;\n          for(h=1; j+h<dims[v]; ++h) {\n            for(k=0; k<w; ++k) {\n              if(c !== mask[n+k+h*dims[u]]) {\n                done = true;\n                break;\n              }\n            }\n            if(done) {\n              break;\n            }\n          }\n          //Add quad\n          x[u] = i;  x[v] = j;\n          var du = [0,0,0]\n            , dv = [0,0,0]; \n          if(c > 0) {\n            dv[v] = h;\n            du[u] = w;\n          } else {\n            c = -c;\n            du[v] = h;\n            dv[u] = w;\n          }\n          var vertex_count = vertices.length;\n          vertices.push([x[0],             x[1],             x[2]            ]);\n          vertices.push([x[0]+du[0],       x[1]+du[1],       x[2]+du[2]      ]);\n          vertices.push([x[0]+du[0]+dv[0], x[1]+du[1]+dv[1], x[2]+du[2]+dv[2]]);\n          vertices.push([x[0]      +dv[0], x[1]      +dv[1], x[2]      +dv[2]]);\n          faces.push([vertex_count, vertex_count+1, vertex_count+2, c]);\n          faces.push([vertex_count, vertex_count+2, vertex_count+3, c]);\n          \n          //Zero-out mask\n          for(l=0; l<h; ++l)\n          for(k=0; k<w; ++k) {\n            mask[n+k+l*dims[u]] = 0;\n          }\n          //Increment counters and continue\n          i += w; n += w;\n        } else {\n          ++i;    ++n;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\nif(exports) {\n  exports.mesher = GreedyMesh;\n}\n"
  },
  {
    "path": "ShapeCarving/js/monotone.js",
    "content": "\"use strict\";\n\nvar MonotoneMesh = (function(){\n\nfunction MonotonePolygon(c, v, ul, ur) {\n  this.color  = c;\n  this.left   = [[ul, v]];\n  this.right  = [[ur, v]];\n};\n\nMonotonePolygon.prototype.close_off = function(v) {\n  this.left.push([ this.left[this.left.length-1][0], v ]);\n  this.right.push([ this.right[this.right.length-1][0], v ]);\n};\n\nMonotonePolygon.prototype.merge_run = function(v, u_l, u_r) {\n  var l = this.left[this.left.length-1][0]\n    , r = this.right[this.right.length-1][0]; \n  if(l !== u_l) {\n    this.left.push([ l, v ]);\n    this.left.push([ u_l, v ]);\n  }\n  if(r !== u_r) {\n    this.right.push([ r, v ]);\n    this.right.push([ u_r, v ]);\n  }\n};\n\n\nreturn function(volume, dims) {\n  function f(i,j,k) {\n    return volume[i + dims[0] * (j + dims[1] * k)];\n  }\n  //Sweep over 3-axes\n  var vertices = [], faces = [];\n  for(var d=0; d<3; ++d) {\n    var i, j, k\n      , u = (d+1)%3   //u and v are orthogonal directions to d\n      , v = (d+2)%3\n      , x = new Int32Array(3)\n      , q = new Int32Array(3)\n      , runs = new Int32Array(2 * (dims[u]+1))\n      , frontier = new Int32Array(dims[u])  //Frontier is list of pointers to polygons\n      , next_frontier = new Int32Array(dims[u])\n      , left_index = new Int32Array(2 * dims[v])\n      , right_index = new Int32Array(2 * dims[v])\n      , stack = new Int32Array(24 * dims[v])\n      , delta = [[0,0], [0,0]];\n    //q points along d-direction\n    q[d] = 1;\n    //Initialize sentinel\n    for(x[d]=-1; x[d]<dims[d]; ) {\n      // --- Perform monotone polygon subdivision ---\n      var n = 0\n        , polygons = []\n        , nf = 0;\n      for(x[v]=0; x[v]<dims[v]; ++x[v]) {\n        //Make one pass over the u-scan line of the volume to run-length encode polygon\n        var nr = 0, p = 0, c = 0;\n        for(x[u]=0; x[u]<dims[u]; ++x[u], p = c) {\n          //Compute the type for this face\n          var a = (0    <= x[d]      ? f(x[0],      x[1],      x[2])      : 0)\n            , b = (x[d] <  dims[d]-1 ? f(x[0]+q[0], x[1]+q[1], x[2]+q[2]) : 0);\n          c = a;\n          if((!a) === (!b)) {\n            c = 0;\n          } else if(!a) {\n            c = -b;\n          }\n          //If cell type doesn't match, start a new run\n          if(p !== c) {\n            runs[nr++] = x[u];\n            runs[nr++] = c;\n          }\n        }\n        //Add sentinel run\n        runs[nr++] = dims[u];\n        runs[nr++] = 0;\n        //Update frontier by merging runs\n        var fp = 0;\n        for(var i=0, j=0; i<nf && j<nr-2; ) {\n          var p    = polygons[frontier[i]]\n            , p_l  = p.left[p.left.length-1][0]\n            , p_r  = p.right[p.right.length-1][0]\n            , p_c  = p.color\n            , r_l  = runs[j]    //Start of run\n            , r_r  = runs[j+2]  //End of run\n            , r_c  = runs[j+1]; //Color of run\n          //Check if we can merge run with polygon\n          if(r_r > p_l && p_r > r_l && r_c === p_c) {\n            //Merge run\n            p.merge_run(x[v], r_l, r_r);\n            //Insert polygon into frontier\n            next_frontier[fp++] = frontier[i];\n            ++i;\n            j += 2;\n          } else {\n            //Check if we need to advance the run pointer\n            if(r_r <= p_r) {\n              if(!!r_c) {\n                var n_poly = new MonotonePolygon(r_c, x[v], r_l, r_r);\n                next_frontier[fp++] = polygons.length;\n                polygons.push(n_poly);\n              }\n              j += 2;\n            }\n            //Check if we need to advance the frontier pointer\n            if(p_r <= r_r) {\n              p.close_off(x[v]);\n              ++i;\n            }\n          }\n        }\n        //Close off any residual polygons\n        for(; i<nf; ++i) {\n          polygons[frontier[i]].close_off(x[v]);\n        }\n        //Add any extra runs to frontier\n        for(; j<nr-2; j+=2) {\n          var r_l  = runs[j]\n            , r_r  = runs[j+2]\n            , r_c  = runs[j+1];\n          if(!!r_c) {\n            var n_poly = new MonotonePolygon(r_c, x[v], r_l, r_r);\n            next_frontier[fp++] = polygons.length;\n            polygons.push(n_poly);\n          }\n        }\n        //Swap frontiers\n        var tmp = next_frontier;\n        next_frontier = frontier;\n        frontier = tmp;\n        nf = fp;\n      }\n      //Close off frontier\n      for(var i=0; i<nf; ++i) {\n        var p = polygons[frontier[i]];\n        p.close_off(dims[v]);\n      }\n      // --- Monotone subdivision of polygon is complete at this point ---\n      \n      x[d]++;\n      \n      //Now we just need to triangulate each monotone polygon\n      for(var i=0; i<polygons.length; ++i) {\n        var p = polygons[i]\n          , c = p.color\n          , flipped = false;\n        if(c < 0) {\n          flipped = true;\n          c = -c;\n        }\n        for(var j=0; j<p.left.length; ++j) {\n          left_index[j] = vertices.length;\n          var y = [0.0,0.0,0.0]\n            , z = p.left[j];\n          y[d] = x[d];\n          y[u] = z[0];\n          y[v] = z[1];\n          vertices.push(y);\n        }\n        for(var j=0; j<p.right.length; ++j) {\n          right_index[j] = vertices.length;\n          var y = [0.0,0.0,0.0]\n            , z = p.right[j];\n          y[d] = x[d];\n          y[u] = z[0];\n          y[v] = z[1];\n          vertices.push(y);\n        }\n        //Triangulate the monotone polygon\n        var bottom = 0\n          , top = 0\n          , l_i = 1\n          , r_i = 1\n          , side = true;  //true = right, false = left\n        \n        stack[top++] = left_index[0];\n        stack[top++] = p.left[0][0];\n        stack[top++] = p.left[0][1];\n        \n        stack[top++] = right_index[0];\n        stack[top++] = p.right[0][0];\n        stack[top++] = p.right[0][1];\n        \n        while(l_i < p.left.length || r_i < p.right.length) {\n          //Compute next side\n          var n_side = false;\n          if(l_i === p.left.length) {\n            n_side = true;\n          } else if(r_i !== p.right.length) {\n            var l = p.left[l_i]\n              , r = p.right[r_i];\n            n_side = l[1] > r[1];\n          }\n          var idx = n_side ? right_index[r_i] : left_index[l_i]\n            , vert = n_side ? p.right[r_i] : p.left[l_i];\n          if(n_side !== side) {\n            //Opposite side\n            while(bottom+3 < top) {\n              if(flipped === n_side) {\n                faces.push([ stack[bottom], stack[bottom+3], idx, c]);\n              } else {\n                faces.push([ stack[bottom+3], stack[bottom], idx, c]);              \n              }\n              bottom += 3;\n            }\n          } else {\n            //Same side\n            while(bottom+3 < top) {\n              //Compute convexity\n              for(var j=0; j<2; ++j)\n              for(var k=0; k<2; ++k) {\n                delta[j][k] = stack[top-3*(j+1)+k+1] - vert[k];\n              }\n              var det = delta[0][0] * delta[1][1] - delta[1][0] * delta[0][1];\n              if(n_side === (det > 0)) {\n                break;\n              }\n              if(det !== 0) {\n                if(flipped === n_side) {\n                  faces.push([ stack[top-3], stack[top-6], idx, c ]);\n                } else {\n                  faces.push([ stack[top-6], stack[top-3], idx, c ]);\n                }\n              }\n              top -= 3;\n            }\n          }\n          //Push vertex\n          stack[top++] = idx;\n          stack[top++] = vert[0];\n          stack[top++] = vert[1];\n          //Update loop index\n          if(n_side) {\n            ++r_i;\n          } else {\n            ++l_i;\n          }\n          side = n_side;\n        }\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n})();\n\nif(exports) {\n  exports.mesher = MonotoneMesh;\n}\n"
  },
  {
    "path": "ShapeCarving/js/shapecarve.js",
    "content": "\"use strict\";\n\nfunction ShapeCarve(dims, views, mask_color, skip) {\n  var x = new Int32Array(3)\n    , volume = new Int32Array(dims[0] * dims[1] * dims[2])\n    , depth = [];\n  \n  //Initialize volume\n  for(var i=0; i<volume.length; ++i) {\n    volume[i] = -1;\n  }\n  \n  //Initialize depth fields\n  for(var d=0; d<3; ++d) {\n    var u = (d+1)%3\n      , v = (d+2)%3;\n    for(var s=0; s<=dims[d]-1; s+=dims[d]-1) {\n      var vals = new Int32Array(dims[u] * dims[v])\n        , view = views[depth.length]\n        , s_op = (s === 0) ? dims[d]-1 : 0;\n      for(var i=0; i<vals.length; ++i) {\n        vals[i] = (!skip[depth.length] && view[i] === mask_color) ? s_op : s;\n      }\n      depth.push(vals);\n    }\n    \n    //Clear out volume\n    for(x[v]=0; x[v]<dims[v]; ++x[v])\n    for(x[u]=0; x[u]<dims[u]; ++x[u])\n    for(x[d]=depth[2*d+1][x[u]+x[v]*dims[u]]; x[d]<=depth[2*d][x[u]+x[v]*dims[u]]; ++x[d]) {\n      volume[x[0]+dims[0]*(x[1] + dims[1]*x[2])] = mask_color;\n    }\n  }\n  \n  //Perform iterative seam carving until convergence\n  var removed = 1;\n  while(removed > 0) {\n    removed = 0;\n    for(var d=0; d<3; ++d) {\n      var u = (d+1)%3\n        , v = (d+2)%3;\n      \n      //Do front/back sweep\n      for(s=-1; s<=1; s+=2) {\n        var v_num = 2*d + ((s<0) ? 1 : 0);\n        if(skip[v_num]) {\n          continue;\n        }\n        \n        var aview = views[v_num]\n          , adepth = depth[v_num];\n        \n        for(x[v]=0; x[v]<dims[v]; ++x[v])\n        for(x[u]=0; x[u]<dims[u]; ++x[u]) {\n        \n          //March along ray\n          var buf_idx = x[u] + x[v]*dims[u];\n          for(x[d] = adepth[buf_idx]; 0<=x[d] && x[d]<dims[d]; x[d]+=s) {\n          \n            //Read volume color\n            var vol_idx = x[0] + dims[0] * (x[1] + dims[1] * x[2])\n              , color = volume[vol_idx];\n            if(color === mask_color) {\n              continue;\n            }\n            \n            color = volume[vol_idx] = aview[x[u] + dims[u] * x[v]];\n            \n            //Check photoconsistency of volume at x\n            var consistent = true;\n            for(var a=0; consistent && a<3; ++a) {\n              var b = (a+1)%3\n                , c = (a+2)%3\n                , idx = x[b] + dims[b] * x[c];\n              for(var t=0; t<2; ++t) {\n                var fnum = 2*a+t;\n                if(skip[fnum]) {\n                  continue;\n                }\n                var fcolor = views[fnum][idx]\n                  , fdepth = depth[fnum][idx];\n                if(t ?  fdepth <= x[a] : x[a] <= fdepth) {\n                  if(fcolor !== color) {\n                    consistent = false;\n                    break;\n                  }\n                }\n              }\n            }\n            if(consistent) {\n              break;\n            }\n            \n            //Clear out voxel\n            ++removed;\n            volume[vol_idx] = mask_color;\n          }\n          \n          //Update depth value\n          adepth[buf_idx] = x[d];\n        }\n      }\n    }\n  }\n  \n  \n  //Do a final pass to fill in any missing colors\n  var n = 0;\n  for(x[2]=0; x[2]<dims[2]; ++x[2])\n  for(x[1]=0; x[1]<dims[1]; ++x[1])\n  for(x[0]=0; x[0]<dims[0]; ++x[0], ++n) {\n    if(volume[n] < 0) {\n      volume[n] = 0xff00ff;\n    }\n  }\n  \n  return { volume:volume, dims:dims };\n}\n\n"
  },
  {
    "path": "ShapeCarving/js/stupid.js",
    "content": "//The stupidest possible way to generate a Minecraft mesh (I think)\nfunction StupidMesh(volume, dims) {\n  var vertices = [], faces = [], x = [0,0,0], n = 0;\n  for(x[2]=0; x[2]<dims[2]; ++x[2])\n  for(x[1]=0; x[1]<dims[1]; ++x[1])\n  for(x[0]=0; x[0]<dims[0]; ++x[0], ++n)\n  if(!!volume[n]) {\n    for(var d=0; d<3; ++d) {\n      var t = [x[0], x[1], x[2]]\n        , u = [0,0,0]\n        , v = [0,0,0];\n      u[(d+1)%3] = 1;\n      v[(d+2)%3] = 1;\n      for(var s=0; s<2; ++s) {\n        t[d] = x[d] + s;\n        var tmp = u;\n        u = v;\n        v = tmp;\n        var vertex_count = vertices.length;\n        vertices.push([t[0],           t[1],           t[2]          ]);\n        vertices.push([t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]);\n        vertices.push([t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]);\n        vertices.push([t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]);\n        faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, volume[n]]);\n      }\n    }\n  }\n  return { vertices:vertices, faces:faces };\n}\n\n\nif(exports) {\n  exports.mesher = StupidMesh;\n}\n"
  },
  {
    "path": "ShapeCarving/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function makeVoxels(l, h, f) {\n    var d = [ h[0]-l[0], h[1]-l[1], h[2]-l[2] ]\n      , v = new Int32Array(d[0]*d[1]*d[2])\n      , n = 0;\n    for(var k=l[2]; k<h[2]; ++k)\n    for(var j=l[1]; j<h[1]; ++j)\n    for(var i=l[0]; i<h[0]; ++i, ++n) {\n      v[n] = f(i,j,k);\n    }\n    return {voxels:v, dims:d};\n  }\n  \n  var colorTab = [\n    0xff0000,\n    0x00ff00,\n    0x0000ff,\n    0xff00ff,\n    0xffff00,\n    0x00ffff,\n    0x000001,\n    0xffffff\n  ];\n  \n  \n  \n  for(var i=1,c=0; i<=16; i<<=1,++c) {\n    result[i + 'x' + i + 'x' + i] = makeVoxels([0,0,0], [i,i,i], function() { return colorTab[c]; });\n  }\n  \n  result['Sphere'] = makeVoxels([-16,-16,-16], [16,16,16], function(i,j,k) {\n    return i*i+j*j+k*k <= 16*16 ? 0x113344 : 0;\n  });\n\n  result['I-Shape'] = makeVoxels([0,-1,-1], [1,2,2], function(i,j,k) {\n    if((j === -1 && k === 0) ||\n       (j ===  1 && k === 0) ) {\n      return 0;   \n    }\n    return 1;\n  });\n  \n  result['Tiny Button'] = makeVoxels([-1,-1,-1],[1,2,2], function(i,j,k) {\n    if(i === 0) {\n      return (j === 0 && k === 0) ? 0xff0000 : 0;\n    }\n    return 1;\n  });\n  \n\n  result['Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.random() < 0.1 ? Math.random() * 0xffffff : 0;\n  });\n\n  result['Dense Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.round(Math.random() * 0xffffff);\n  });\n\n  result['16 Color Noise'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    return Math.random() < 0.1 ? colorTab[Math.floor(Math.random() * colorTab.length)] : 0;\n  });\n\n  result['Hole'] = makeVoxels([0,0,0], [16,16,1], function(i,j,k) {\n    return Math.abs(i-7) > 3 || Math.abs(j-7) > 3 ? 1 : 0;\n  });\n  \n  result['Boss'] = makeVoxels([0,0,0], [16,16,4], function(i,j,k) {\n    if(k === 0) {\n      return 0x0000ff;\n    } else if(Math.abs(i-4) < 2 && Math.abs(j-5) < 2 && k< 2) {\n      return 0x00ff00;\n    } else if(10 <= i && i < 14 && 2 <= j && j < 15) {\n      return 0xff0000;\n    }\n    return 0;\n  });\n  \n  result['T-Shape'] = makeVoxels([0,0,0], [16,16,3], function(i,j,k) {\n    return (( 6 <= i && i < 10 && 2 <= j && j < 13) ||\n      ( 2 <= i && i < 14 && 8 <= j && j < 13)) ? 0xcc00dd : 0;\n  });\n  \n  result['HollowCube'] = makeVoxels([0,0,0], [16,16,16], function(i,j,k) {\n    if(i < 1) {\n      return 0xff0000;\n    } else if(i >= 15) {\n      return 0x00ffff;\n    } else if(j < 1) {\n      return 0x00ff00;\n    } else if(j >= 15) {\n      return 0xff00ff;\n    } else if(k < 1) {\n      return 0x0000ff;\n    } else if(k >= 15) {\n      return 0xffff00;\n    } else {\n      return 0;\n    }\n  });\n  \n  \n  result['Clover'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    if(i == 0 && Math.abs(j-8) <= 2) {\n      return 0;\n    } else if(i == 16 && Math.abs(j-8) <= 2) {\n      return 0;\n    } else if(j == 0 && Math.abs(i-8) <= 2) {\n      return 0;\n    } else if(j == 16 && Math.abs(i-8) <= 2) {\n      return 0;\n    } else {\n      return 0x10de60;\n    }\n  });\n  \n  result['Triangle'] = makeVoxels([0,0,0], [17,17,1], function(i,j,k) {\n    return (i < j) ? 0xff00ff : 0;\n  });\n  \n  \n  result['Saw'] = makeVoxels([0,0,0], [17,3,1], function(i,j,k) {\n    if( j > 0 || !!(i & 1) ) {\n      return 0x00ffff;\n    }\n    return 0;\n  });\n  \n  result['4Dots']  = makeVoxels([0,0,0], [7,7,1], function(i,j,k) {\n    if( (i == 2 && j == 1) ||\n        (i == 5 && j == 2) ||\n        (i == 1 && j == 4) ||\n        (i == 4 && j == 5) ) {\n      return 0x00ff;    \n    }\n    return 0xeedd00;\n  });\n  \n  result['Checker'] = makeVoxels([0,0,0], [8,8,8], function(i,j,k) {\n    return !!((i+j+k)&1) ? (((i^j^k)&2) ? 1 : 0xffffff) : 0;\n  });\n  \n  \n  result[\"Matt's Example\"]  = makeVoxels([0,0,0], [4,5,1], function(i,j,k) {\n    if( (i == 1 && j == 1) ||\n        (i == 2 && j == 3) ) {\n      return 0xee5533;\n    }\n    return 0x128844;\n  });\n  \n  result['Benchmark (SLOW!)'] = makeVoxels([-32, -32, -32], [33, 33, 33], function(x, y, z) {\n    var s = 2.0 * Math.PI / 32.0;\n    return Math.sin(s * x) + Math.sin(s * y) + Math.sin(s * z) < 0 ? 1 : 0;\n  });\n  \n  result['Hill'] = makeVoxels([-16, 0, -16], [16,16,16], function(i,j,k) {\n    return j <= 16 * Math.exp(-(i*i + k*k) / 64) ? 0x118822 : 0;\n  });\n  \n  result['Valley'] = makeVoxels([0,0,0], [32,32,32], function(i,j,k) {\n    return j <= (i*i + k*k) * 31 / (32*32*2) + 1 ? 0x118822 : 0;\n  });\n  \n  result['Hilly Terrain'] = makeVoxels([0, 0, 0], [32,32,32], function(i,j,k) {\n    var h0 = 3.0 * Math.sin(Math.PI * i / 12.0 - Math.PI * k * 0.1) + 27;    \n    if(j > h0+1) {\n      return 0;\n    }\n    if(h0 <= j) {\n      return 0x23dd31;\n    }\n    var h1 = 2.0 * Math.sin(Math.PI * i * 0.25 - Math.PI * k * 0.3) + 20;\n    if(h1 <= j) {\n      return 0x964B00;\n    }\n    if(2 < j) {\n      return Math.random() < 0.1 ? 0x222222 : 0xaaaaaa;\n    }\n    return 0xff0000;\n  });\n  \n  result['Empty'] = { voxels : [], dims : [0,0,0] };\n\n  return result;\n}\n"
  },
  {
    "path": "ShapeCarving/jscolor/demo.html",
    "content": "<html>\n<head>\n\t<title>jscolor demo</title>\n</head>\n<body>\n\n\t<script type=\"text/javascript\" src=\"jscolor.js\"></script>\n\n\tClick here: <input class=\"color\" value=\"66ff00\">\n\n</body>\n</html>\n"
  },
  {
    "path": "ShapeCarving/jscolor/jscolor.js",
    "content": "/**\r\n * jscolor, JavaScript Color Picker\r\n *\r\n * @version 1.4.0\r\n * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html\r\n * @author  Jan Odvarko, http://odvarko.cz\r\n * @created 2008-06-15\r\n * @updated 2012-07-06\r\n * @link    http://jscolor.com\r\n */\r\n\r\n\r\nvar jscolor = {\r\n\r\n\r\n\tdir : '', // location of jscolor directory (leave empty to autodetect)\r\n\tbindClass : 'color', // class name\r\n\tbinding : true, // automatic binding via <input class=\"...\">\r\n\tpreloading : true, // use image preloading?\r\n\r\n\r\n\tinstall : function() {\r\n\t\tjscolor.addEvent(window, 'load', jscolor.init);\r\n\t},\r\n\r\n\r\n\tinit : function() {\r\n\t\tif(jscolor.binding) {\r\n\t\t\tjscolor.bind();\r\n\t\t}\r\n\t\tif(jscolor.preloading) {\r\n\t\t\tjscolor.preload();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetDir : function() {\r\n\t\tif(!jscolor.dir) {\r\n\t\t\tvar detected = jscolor.detectDir();\r\n\t\t\tjscolor.dir = detected!==false ? detected : 'jscolor/';\r\n\t\t}\r\n\t\treturn jscolor.dir;\r\n\t},\r\n\r\n\r\n\tdetectDir : function() {\r\n\t\tvar base = location.href;\r\n\r\n\t\tvar e = document.getElementsByTagName('base');\r\n\t\tfor(var i=0; i<e.length; i+=1) {\r\n\t\t\tif(e[i].href) { base = e[i].href; }\r\n\t\t}\r\n\r\n\t\tvar e = document.getElementsByTagName('script');\r\n\t\tfor(var i=0; i<e.length; i+=1) {\r\n\t\t\tif(e[i].src && /(^|\\/)jscolor\\.js([?#].*)?$/i.test(e[i].src)) {\r\n\t\t\t\tvar src = new jscolor.URI(e[i].src);\r\n\t\t\t\tvar srcAbs = src.toAbsolute(base);\r\n\t\t\t\tsrcAbs.path = srcAbs.path.replace(/[^\\/]+$/, ''); // remove filename\r\n\t\t\t\tsrcAbs.query = null;\r\n\t\t\t\tsrcAbs.fragment = null;\r\n\t\t\t\treturn srcAbs.toString();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tbind : function() {\r\n\t\tvar matchClass = new RegExp('(^|\\\\s)('+jscolor.bindClass+')\\\\s*(\\\\{[^}]*\\\\})?', 'i');\r\n\t\tvar e = document.getElementsByTagName('input');\r\n\t\tfor(var i=0; i<e.length; i+=1) {\r\n\t\t\tvar m;\r\n\t\t\tif(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {\r\n\t\t\t\tvar prop = {};\r\n\t\t\t\tif(m[3]) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tprop = (new Function ('return (' + m[3] + ')'))();\r\n\t\t\t\t\t} catch(eInvalidProp) {}\r\n\t\t\t\t}\r\n\t\t\t\te[i].color = new jscolor.color(e[i], prop);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tpreload : function() {\r\n\t\tfor(var fn in jscolor.imgRequire) {\r\n\t\t\tif(jscolor.imgRequire.hasOwnProperty(fn)) {\r\n\t\t\t\tjscolor.loadImage(fn);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\timages : {\r\n\t\tpad : [ 181, 101 ],\r\n\t\tsld : [ 16, 101 ],\r\n\t\tcross : [ 15, 15 ],\r\n\t\tarrow : [ 7, 11 ]\r\n\t},\r\n\r\n\r\n\timgRequire : {},\r\n\timgLoaded : {},\r\n\r\n\r\n\trequireImage : function(filename) {\r\n\t\tjscolor.imgRequire[filename] = true;\r\n\t},\r\n\r\n\r\n\tloadImage : function(filename) {\r\n\t\tif(!jscolor.imgLoaded[filename]) {\r\n\t\t\tjscolor.imgLoaded[filename] = new Image();\r\n\t\t\tjscolor.imgLoaded[filename].src = jscolor.getDir()+filename;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tfetchElement : function(mixed) {\r\n\t\treturn typeof mixed === 'string' ? document.getElementById(mixed) : mixed;\r\n\t},\r\n\r\n\r\n\taddEvent : function(el, evnt, func) {\r\n\t\tif(el.addEventListener) {\r\n\t\t\tel.addEventListener(evnt, func, false);\r\n\t\t} else if(el.attachEvent) {\r\n\t\t\tel.attachEvent('on'+evnt, func);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tfireEvent : function(el, evnt) {\r\n\t\tif(!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(document.createEvent) {\r\n\t\t\tvar ev = document.createEvent('HTMLEvents');\r\n\t\t\tev.initEvent(evnt, true, true);\r\n\t\t\tel.dispatchEvent(ev);\r\n\t\t} else if(document.createEventObject) {\r\n\t\t\tvar ev = document.createEventObject();\r\n\t\t\tel.fireEvent('on'+evnt, ev);\r\n\t\t} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)\r\n\t\t\tel['on'+evnt]();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetElementPos : function(e) {\r\n\t\tvar e1=e, e2=e;\r\n\t\tvar x=0, y=0;\r\n\t\tif(e1.offsetParent) {\r\n\t\t\tdo {\r\n\t\t\t\tx += e1.offsetLeft;\r\n\t\t\t\ty += e1.offsetTop;\r\n\t\t\t} while(e1 = e1.offsetParent);\r\n\t\t}\r\n\t\twhile((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {\r\n\t\t\tx -= e2.scrollLeft;\r\n\t\t\ty -= e2.scrollTop;\r\n\t\t}\r\n\t\treturn [x, y];\r\n\t},\r\n\r\n\r\n\tgetElementSize : function(e) {\r\n\t\treturn [e.offsetWidth, e.offsetHeight];\r\n\t},\r\n\r\n\r\n\tgetRelMousePos : function(e) {\r\n\t\tvar x = 0, y = 0;\r\n\t\tif (!e) { e = window.event; }\r\n\t\tif (typeof e.offsetX === 'number') {\r\n\t\t\tx = e.offsetX;\r\n\t\t\ty = e.offsetY;\r\n\t\t} else if (typeof e.layerX === 'number') {\r\n\t\t\tx = e.layerX;\r\n\t\t\ty = e.layerY;\r\n\t\t}\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\tgetViewPos : function() {\r\n\t\tif(typeof window.pageYOffset === 'number') {\r\n\t\t\treturn [window.pageXOffset, window.pageYOffset];\r\n\t\t} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {\r\n\t\t\treturn [document.body.scrollLeft, document.body.scrollTop];\r\n\t\t} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {\r\n\t\t\treturn [document.documentElement.scrollLeft, document.documentElement.scrollTop];\r\n\t\t} else {\r\n\t\t\treturn [0, 0];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetViewSize : function() {\r\n\t\tif(typeof window.innerWidth === 'number') {\r\n\t\t\treturn [window.innerWidth, window.innerHeight];\r\n\t\t} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {\r\n\t\t\treturn [document.body.clientWidth, document.body.clientHeight];\r\n\t\t} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {\r\n\t\t\treturn [document.documentElement.clientWidth, document.documentElement.clientHeight];\r\n\t\t} else {\r\n\t\t\treturn [0, 0];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tURI : function(uri) { // See RFC3986\r\n\r\n\t\tthis.scheme = null;\r\n\t\tthis.authority = null;\r\n\t\tthis.path = '';\r\n\t\tthis.query = null;\r\n\t\tthis.fragment = null;\r\n\r\n\t\tthis.parse = function(uri) {\r\n\t\t\tvar m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\\/\\/)([^\\/?#]*))?([^?#]*)((\\?)([^#]*))?((#)(.*))?/);\r\n\t\t\tthis.scheme = m[3] ? m[2] : null;\r\n\t\t\tthis.authority = m[5] ? m[6] : null;\r\n\t\t\tthis.path = m[7];\r\n\t\t\tthis.query = m[9] ? m[10] : null;\r\n\t\t\tthis.fragment = m[12] ? m[13] : null;\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\tthis.toString = function() {\r\n\t\t\tvar result = '';\r\n\t\t\tif(this.scheme !== null) { result = result + this.scheme + ':'; }\r\n\t\t\tif(this.authority !== null) { result = result + '//' + this.authority; }\r\n\t\t\tif(this.path !== null) { result = result + this.path; }\r\n\t\t\tif(this.query !== null) { result = result + '?' + this.query; }\r\n\t\t\tif(this.fragment !== null) { result = result + '#' + this.fragment; }\r\n\t\t\treturn result;\r\n\t\t};\r\n\r\n\t\tthis.toAbsolute = function(base) {\r\n\t\t\tvar base = new jscolor.URI(base);\r\n\t\t\tvar r = this;\r\n\t\t\tvar t = new jscolor.URI;\r\n\r\n\t\t\tif(base.scheme === null) { return false; }\r\n\r\n\t\t\tif(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {\r\n\t\t\t\tr.scheme = null;\r\n\t\t\t}\r\n\r\n\t\t\tif(r.scheme !== null) {\r\n\t\t\t\tt.scheme = r.scheme;\r\n\t\t\t\tt.authority = r.authority;\r\n\t\t\t\tt.path = removeDotSegments(r.path);\r\n\t\t\t\tt.query = r.query;\r\n\t\t\t} else {\r\n\t\t\t\tif(r.authority !== null) {\r\n\t\t\t\t\tt.authority = r.authority;\r\n\t\t\t\t\tt.path = removeDotSegments(r.path);\r\n\t\t\t\t\tt.query = r.query;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif(r.path === '') {\r\n\t\t\t\t\t\tt.path = base.path;\r\n\t\t\t\t\t\tif(r.query !== null) {\r\n\t\t\t\t\t\t\tt.query = r.query;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tt.query = base.query;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(r.path.substr(0,1) === '/') {\r\n\t\t\t\t\t\t\tt.path = removeDotSegments(r.path);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif(base.authority !== null && base.path === '') {\r\n\t\t\t\t\t\t\t\tt.path = '/'+r.path;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tt.path = base.path.replace(/[^\\/]+$/,'')+r.path;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tt.path = removeDotSegments(t.path);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tt.query = r.query;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt.authority = base.authority;\r\n\t\t\t\t}\r\n\t\t\t\tt.scheme = base.scheme;\r\n\t\t\t}\r\n\t\t\tt.fragment = r.fragment;\r\n\r\n\t\t\treturn t;\r\n\t\t};\r\n\r\n\t\tfunction removeDotSegments(path) {\r\n\t\t\tvar out = '';\r\n\t\t\twhile(path) {\r\n\t\t\t\tif(path.substr(0,3)==='../' || path.substr(0,2)==='./') {\r\n\t\t\t\t\tpath = path.replace(/^\\.+/,'').substr(1);\r\n\t\t\t\t} else if(path.substr(0,3)==='/./' || path==='/.') {\r\n\t\t\t\t\tpath = '/'+path.substr(3);\r\n\t\t\t\t} else if(path.substr(0,4)==='/../' || path==='/..') {\r\n\t\t\t\t\tpath = '/'+path.substr(4);\r\n\t\t\t\t\tout = out.replace(/\\/?[^\\/]*$/, '');\r\n\t\t\t\t} else if(path==='.' || path==='..') {\r\n\t\t\t\t\tpath = '';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar rm = path.match(/^\\/?[^\\/]*/)[0];\r\n\t\t\t\t\tpath = path.substr(rm.length);\r\n\t\t\t\t\tout = out + rm;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn out;\r\n\t\t}\r\n\r\n\t\tif(uri) {\r\n\t\t\tthis.parse(uri);\r\n\t\t}\r\n\r\n\t},\r\n\r\n\r\n\t/*\r\n\t * Usage example:\r\n\t * var myColor = new jscolor.color(myInputElement)\r\n\t */\r\n\r\n\tcolor : function(target, prop) {\r\n\r\n\r\n\t\tthis.required = true; // refuse empty values?\r\n\t\tthis.adjust = true; // adjust value to uniform notation?\r\n\t\tthis.hash = false; // prefix color with # symbol?\r\n\t\tthis.caps = true; // uppercase?\r\n\t\tthis.slider = true; // show the value/saturation slider?\r\n\t\tthis.valueElement = target; // value holder\r\n\t\tthis.styleElement = target; // where to reflect current color\r\n\t\tthis.onImmediateChange = null; // onchange callback (can be either string or function)\r\n\t\tthis.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1\r\n\t\tthis.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1\r\n\t\tthis.minH = 0; // read-only  0-6\r\n\t\tthis.maxH = 6; // read-only  0-6\r\n\t\tthis.minS = 0; // read-only  0-1\r\n\t\tthis.maxS = 1; // read-only  0-1\r\n\t\tthis.minV = 0; // read-only  0-1\r\n\t\tthis.maxV = 1; // read-only  0-1\r\n\r\n\t\tthis.pickerOnfocus = true; // display picker on focus?\r\n\t\tthis.pickerMode = 'HSV'; // HSV | HVS\r\n\t\tthis.pickerPosition = 'bottom'; // left | right | top | bottom\r\n\t\tthis.pickerSmartPosition = true; // automatically adjust picker position when necessary\r\n\t\tthis.pickerButtonHeight = 20; // px\r\n\t\tthis.pickerClosable = false;\r\n\t\tthis.pickerCloseText = 'Close';\r\n\t\tthis.pickerButtonColor = 'ButtonText'; // px\r\n\t\tthis.pickerFace = 10; // px\r\n\t\tthis.pickerFaceColor = 'ThreeDFace'; // CSS color\r\n\t\tthis.pickerBorder = 1; // px\r\n\t\tthis.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color\r\n\t\tthis.pickerInset = 1; // px\r\n\t\tthis.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color\r\n\t\tthis.pickerZIndex = 10000;\r\n\r\n\r\n\t\tfor(var p in prop) {\r\n\t\t\tif(prop.hasOwnProperty(p)) {\r\n\t\t\t\tthis[p] = prop[p];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tthis.hidePicker = function() {\r\n\t\t\tif(isPickerOwner()) {\r\n\t\t\t\tremovePicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.showPicker = function() {\r\n\t\t\tif(!isPickerOwner()) {\r\n\t\t\t\tvar tp = jscolor.getElementPos(target); // target pos\r\n\t\t\t\tvar ts = jscolor.getElementSize(target); // target size\r\n\t\t\t\tvar vp = jscolor.getViewPos(); // view pos\r\n\t\t\t\tvar vs = jscolor.getViewSize(); // view size\r\n\t\t\t\tvar ps = getPickerDims(this); // picker size\r\n\t\t\t\tvar a, b, c;\r\n\t\t\t\tswitch(this.pickerPosition.toLowerCase()) {\r\n\t\t\t\t\tcase 'left': a=1; b=0; c=-1; break;\r\n\t\t\t\t\tcase 'right':a=1; b=0; c=1; break;\r\n\t\t\t\t\tcase 'top':  a=0; b=1; c=-1; break;\r\n\t\t\t\t\tdefault:     a=0; b=1; c=1; break;\r\n\t\t\t\t}\r\n\t\t\t\tvar l = (ts[b]+ps[b])/2;\r\n\r\n\t\t\t\t// picker pos\r\n\t\t\t\tif (!this.pickerSmartPosition) {\r\n\t\t\t\t\tvar pp = [\r\n\t\t\t\t\t\ttp[a],\r\n\t\t\t\t\t\ttp[b]+ts[b]-l+l*c\r\n\t\t\t\t\t];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar pp = [\r\n\t\t\t\t\t\t-vp[a]+tp[a]+ps[a] > vs[a] ?\r\n\t\t\t\t\t\t\t(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :\r\n\t\t\t\t\t\t\ttp[a],\r\n\t\t\t\t\t\t-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?\r\n\t\t\t\t\t\t\t(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :\r\n\t\t\t\t\t\t\t(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)\r\n\t\t\t\t\t];\r\n\t\t\t\t}\r\n\t\t\t\tdrawPicker(pp[a], pp[b]);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.importColor = function() {\r\n\t\t\tif(!valueElement) {\r\n\t\t\t\tthis.exportColor();\r\n\t\t\t} else {\r\n\t\t\t\tif(!this.adjust) {\r\n\t\t\t\t\tif(!this.fromString(valueElement.value, leaveValue)) {\r\n\t\t\t\t\t\tstyleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;\r\n\t\t\t\t\t\tstyleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;\r\n\t\t\t\t\t\tstyleElement.style.color = styleElement.jscStyle.color;\r\n\t\t\t\t\t\tthis.exportColor(leaveValue | leaveStyle);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if(!this.required && /^\\s*$/.test(valueElement.value)) {\r\n\t\t\t\t\tvalueElement.value = '';\r\n\t\t\t\t\tstyleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;\r\n\t\t\t\t\tstyleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;\r\n\t\t\t\t\tstyleElement.style.color = styleElement.jscStyle.color;\r\n\t\t\t\t\tthis.exportColor(leaveValue | leaveStyle);\r\n\r\n\t\t\t\t} else if(this.fromString(valueElement.value)) {\r\n\t\t\t\t\t// OK\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.exportColor();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.exportColor = function(flags) {\r\n\t\t\tif(!(flags & leaveValue) && valueElement) {\r\n\t\t\t\tvar value = this.toString();\r\n\t\t\t\tif(this.caps) { value = value.toUpperCase(); }\r\n\t\t\t\tif(this.hash) { value = '#'+value; }\r\n\t\t\t\tvalueElement.value = value;\r\n\t\t\t}\r\n\t\t\tif(!(flags & leaveStyle) && styleElement) {\r\n\t\t\t\tstyleElement.style.backgroundImage = \"none\";\r\n\t\t\t\tstyleElement.style.backgroundColor =\r\n\t\t\t\t\t'#'+this.toString();\r\n\t\t\t\tstyleElement.style.color =\r\n\t\t\t\t\t0.213 * this.rgb[0] +\r\n\t\t\t\t\t0.715 * this.rgb[1] +\r\n\t\t\t\t\t0.072 * this.rgb[2]\r\n\t\t\t\t\t< 0.5 ? '#FFF' : '#000';\r\n\t\t\t}\r\n\t\t\tif(!(flags & leavePad) && isPickerOwner()) {\r\n\t\t\t\tredrawPad();\r\n\t\t\t}\r\n\t\t\tif(!(flags & leaveSld) && isPickerOwner()) {\r\n\t\t\t\tredrawSld();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromHSV = function(h, s, v, flags) { // null = don't change\r\n\t\t\tif(h !== null) { h = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, h)); }\r\n\t\t\tif(s !== null) { s = Math.max(0.0, this.minS, Math.min(1.0, this.maxS, s)); }\r\n\t\t\tif(v !== null) { v = Math.max(0.0, this.minV, Math.min(1.0, this.maxV, v)); }\r\n\r\n\t\t\tthis.rgb = HSV_RGB(\r\n\t\t\t\th===null ? this.hsv[0] : (this.hsv[0]=h),\r\n\t\t\t\ts===null ? this.hsv[1] : (this.hsv[1]=s),\r\n\t\t\t\tv===null ? this.hsv[2] : (this.hsv[2]=v)\r\n\t\t\t);\r\n\r\n\t\t\tthis.exportColor(flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromRGB = function(r, g, b, flags) { // null = don't change\r\n\t\t\tif(r !== null) { r = Math.max(0.0, Math.min(1.0, r)); }\r\n\t\t\tif(g !== null) { g = Math.max(0.0, Math.min(1.0, g)); }\r\n\t\t\tif(b !== null) { b = Math.max(0.0, Math.min(1.0, b)); }\r\n\r\n\t\t\tvar hsv = RGB_HSV(\r\n\t\t\t\tr===null ? this.rgb[0] : r,\r\n\t\t\t\tg===null ? this.rgb[1] : g,\r\n\t\t\t\tb===null ? this.rgb[2] : b\r\n\t\t\t);\r\n\t\t\tif(hsv[0] !== null) {\r\n\t\t\t\tthis.hsv[0] = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, hsv[0]));\r\n\t\t\t}\r\n\t\t\tif(hsv[2] !== 0) {\r\n\t\t\t\tthis.hsv[1] = hsv[1]===null ? null : Math.max(0.0, this.minS, Math.min(1.0, this.maxS, hsv[1]));\r\n\t\t\t}\r\n\t\t\tthis.hsv[2] = hsv[2]===null ? null : Math.max(0.0, this.minV, Math.min(1.0, this.maxV, hsv[2]));\r\n\r\n\t\t\t// update RGB according to final HSV, as some values might be trimmed\r\n\t\t\tvar rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]);\r\n\t\t\tthis.rgb[0] = rgb[0];\r\n\t\t\tthis.rgb[1] = rgb[1];\r\n\t\t\tthis.rgb[2] = rgb[2];\r\n\r\n\t\t\tthis.exportColor(flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromString = function(hex, flags) {\r\n\t\t\tvar m = hex.match(/^\\W*([0-9A-F]{3}([0-9A-F]{3})?)\\W*$/i);\r\n\t\t\tif(!m) {\r\n\t\t\t\treturn false;\r\n\t\t\t} else {\r\n\t\t\t\tif(m[1].length === 6) { // 6-char notation\r\n\t\t\t\t\tthis.fromRGB(\r\n\t\t\t\t\t\tparseInt(m[1].substr(0,2),16) / 255,\r\n\t\t\t\t\t\tparseInt(m[1].substr(2,2),16) / 255,\r\n\t\t\t\t\t\tparseInt(m[1].substr(4,2),16) / 255,\r\n\t\t\t\t\t\tflags\r\n\t\t\t\t\t);\r\n\t\t\t\t} else { // 3-char notation\r\n\t\t\t\t\tthis.fromRGB(\r\n\t\t\t\t\t\tparseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,\r\n\t\t\t\t\t\tparseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,\r\n\t\t\t\t\t\tparseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,\r\n\t\t\t\t\t\tflags\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.toString = function() {\r\n\t\t\treturn (\r\n\t\t\t\t(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +\r\n\t\t\t\t(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +\r\n\t\t\t\t(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tfunction RGB_HSV(r, g, b) {\r\n\t\t\tvar n = Math.min(Math.min(r,g),b);\r\n\t\t\tvar v = Math.max(Math.max(r,g),b);\r\n\t\t\tvar m = v - n;\r\n\t\t\tif(m === 0) { return [ null, 0, v ]; }\r\n\t\t\tvar h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);\r\n\t\t\treturn [ h===6?0:h, m/v, v ];\r\n\t\t}\r\n\r\n\r\n\t\tfunction HSV_RGB(h, s, v) {\r\n\t\t\tif(h === null) { return [ v, v, v ]; }\r\n\t\t\tvar i = Math.floor(h);\r\n\t\t\tvar f = i%2 ? h-i : 1-(h-i);\r\n\t\t\tvar m = v * (1 - s);\r\n\t\t\tvar n = v * (1 - s*f);\r\n\t\t\tswitch(i) {\r\n\t\t\t\tcase 6:\r\n\t\t\t\tcase 0: return [v,n,m];\r\n\t\t\t\tcase 1: return [n,v,m];\r\n\t\t\t\tcase 2: return [m,v,n];\r\n\t\t\t\tcase 3: return [m,n,v];\r\n\t\t\t\tcase 4: return [n,m,v];\r\n\t\t\t\tcase 5: return [v,m,n];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction removePicker() {\r\n\t\t\tdelete jscolor.picker.owner;\r\n\t\t\tdocument.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);\r\n\t\t}\r\n\r\n\r\n\t\tfunction drawPicker(x, y) {\r\n\t\t\tif(!jscolor.picker) {\r\n\t\t\t\tjscolor.picker = {\r\n\t\t\t\t\tbox : document.createElement('div'),\r\n\t\t\t\t\tboxB : document.createElement('div'),\r\n\t\t\t\t\tpad : document.createElement('div'),\r\n\t\t\t\t\tpadB : document.createElement('div'),\r\n\t\t\t\t\tpadM : document.createElement('div'),\r\n\t\t\t\t\tsld : document.createElement('div'),\r\n\t\t\t\t\tsldB : document.createElement('div'),\r\n\t\t\t\t\tsldM : document.createElement('div'),\r\n\t\t\t\t\tbtn : document.createElement('div'),\r\n\t\t\t\t\tbtnS : document.createElement('span'),\r\n\t\t\t\t\tbtnT : document.createTextNode(THIS.pickerCloseText)\r\n\t\t\t\t};\r\n\t\t\t\tfor(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {\r\n\t\t\t\t\tvar seg = document.createElement('div');\r\n\t\t\t\t\tseg.style.height = segSize+'px';\r\n\t\t\t\t\tseg.style.fontSize = '1px';\r\n\t\t\t\t\tseg.style.lineHeight = '0';\r\n\t\t\t\t\tjscolor.picker.sld.appendChild(seg);\r\n\t\t\t\t}\r\n\t\t\t\tjscolor.picker.sldB.appendChild(jscolor.picker.sld);\r\n\t\t\t\tjscolor.picker.box.appendChild(jscolor.picker.sldB);\r\n\t\t\t\tjscolor.picker.box.appendChild(jscolor.picker.sldM);\r\n\t\t\t\tjscolor.picker.padB.appendChild(jscolor.picker.pad);\r\n\t\t\t\tjscolor.picker.box.appendChild(jscolor.picker.padB);\r\n\t\t\t\tjscolor.picker.box.appendChild(jscolor.picker.padM);\r\n\t\t\t\tjscolor.picker.btnS.appendChild(jscolor.picker.btnT);\r\n\t\t\t\tjscolor.picker.btn.appendChild(jscolor.picker.btnS);\r\n\t\t\t\tjscolor.picker.box.appendChild(jscolor.picker.btn);\r\n\t\t\t\tjscolor.picker.boxB.appendChild(jscolor.picker.box);\r\n\t\t\t}\r\n\r\n\t\t\tvar p = jscolor.picker;\r\n\r\n\t\t\t// controls interaction\r\n\t\t\tp.box.onmouseup =\r\n\t\t\tp.box.onmouseout = function() { target.focus(); };\r\n\t\t\tp.box.onmousedown = function() { abortBlur=true; };\r\n\t\t\tp.box.onmousemove = function(e) {\r\n\t\t\t\tif (holdPad || holdSld) {\r\n\t\t\t\t\tholdPad && setPad(e);\r\n\t\t\t\t\tholdSld && setSld(e);\r\n\t\t\t\t\tif (document.selection) {\r\n\t\t\t\t\t\tdocument.selection.empty();\r\n\t\t\t\t\t} else if (window.getSelection) {\r\n\t\t\t\t\t\twindow.getSelection().removeAllRanges();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdispatchImmediateChange();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tp.padM.onmouseup =\r\n\t\t\tp.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };\r\n\t\t\tp.padM.onmousedown = function(e) {\r\n\t\t\t\t// if the slider is at the bottom, move it up\r\n\t\t\t\tswitch(modeID) {\r\n\t\t\t\t\tcase 0: if (THIS.hsv[2] === 0) { THIS.fromHSV(null, null, 1.0); }; break;\r\n\t\t\t\t\tcase 1: if (THIS.hsv[1] === 0) { THIS.fromHSV(null, 1.0, null); }; break;\r\n\t\t\t\t}\r\n\t\t\t\tholdPad=true;\r\n\t\t\t\tsetPad(e);\r\n\t\t\t\tdispatchImmediateChange();\r\n\t\t\t};\r\n\t\t\tp.sldM.onmouseup =\r\n\t\t\tp.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };\r\n\t\t\tp.sldM.onmousedown = function(e) {\r\n\t\t\t\tholdSld=true;\r\n\t\t\t\tsetSld(e);\r\n\t\t\t\tdispatchImmediateChange();\r\n\t\t\t};\r\n\r\n\t\t\t// picker\r\n\t\t\tvar dims = getPickerDims(THIS);\r\n\t\t\tp.box.style.width = dims[0] + 'px';\r\n\t\t\tp.box.style.height = dims[1] + 'px';\r\n\r\n\t\t\t// picker border\r\n\t\t\tp.boxB.style.position = 'absolute';\r\n\t\t\tp.boxB.style.clear = 'both';\r\n\t\t\tp.boxB.style.left = x+'px';\r\n\t\t\tp.boxB.style.top = y+'px';\r\n\t\t\tp.boxB.style.zIndex = THIS.pickerZIndex;\r\n\t\t\tp.boxB.style.border = THIS.pickerBorder+'px solid';\r\n\t\t\tp.boxB.style.borderColor = THIS.pickerBorderColor;\r\n\t\t\tp.boxB.style.background = THIS.pickerFaceColor;\r\n\r\n\t\t\t// pad image\r\n\t\t\tp.pad.style.width = jscolor.images.pad[0]+'px';\r\n\t\t\tp.pad.style.height = jscolor.images.pad[1]+'px';\r\n\r\n\t\t\t// pad border\r\n\t\t\tp.padB.style.position = 'absolute';\r\n\t\t\tp.padB.style.left = THIS.pickerFace+'px';\r\n\t\t\tp.padB.style.top = THIS.pickerFace+'px';\r\n\t\t\tp.padB.style.border = THIS.pickerInset+'px solid';\r\n\t\t\tp.padB.style.borderColor = THIS.pickerInsetColor;\r\n\r\n\t\t\t// pad mouse area\r\n\t\t\tp.padM.style.position = 'absolute';\r\n\t\t\tp.padM.style.left = '0';\r\n\t\t\tp.padM.style.top = '0';\r\n\t\t\tp.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';\r\n\t\t\tp.padM.style.height = p.box.style.height;\r\n\t\t\tp.padM.style.cursor = 'crosshair';\r\n\r\n\t\t\t// slider image\r\n\t\t\tp.sld.style.overflow = 'hidden';\r\n\t\t\tp.sld.style.width = jscolor.images.sld[0]+'px';\r\n\t\t\tp.sld.style.height = jscolor.images.sld[1]+'px';\r\n\r\n\t\t\t// slider border\r\n\t\t\tp.sldB.style.display = THIS.slider ? 'block' : 'none';\r\n\t\t\tp.sldB.style.position = 'absolute';\r\n\t\t\tp.sldB.style.right = THIS.pickerFace+'px';\r\n\t\t\tp.sldB.style.top = THIS.pickerFace+'px';\r\n\t\t\tp.sldB.style.border = THIS.pickerInset+'px solid';\r\n\t\t\tp.sldB.style.borderColor = THIS.pickerInsetColor;\r\n\r\n\t\t\t// slider mouse area\r\n\t\t\tp.sldM.style.display = THIS.slider ? 'block' : 'none';\r\n\t\t\tp.sldM.style.position = 'absolute';\r\n\t\t\tp.sldM.style.right = '0';\r\n\t\t\tp.sldM.style.top = '0';\r\n\t\t\tp.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';\r\n\t\t\tp.sldM.style.height = p.box.style.height;\r\n\t\t\ttry {\r\n\t\t\t\tp.sldM.style.cursor = 'pointer';\r\n\t\t\t} catch(eOldIE) {\r\n\t\t\t\tp.sldM.style.cursor = 'hand';\r\n\t\t\t}\r\n\r\n\t\t\t// \"close\" button\r\n\t\t\tfunction setBtnBorder() {\r\n\t\t\t\tvar insetColors = THIS.pickerInsetColor.split(/\\s+/);\r\n\t\t\t\tvar pickerOutsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];\r\n\t\t\t\tp.btn.style.borderColor = pickerOutsetColor;\r\n\t\t\t}\r\n\t\t\tp.btn.style.display = THIS.pickerClosable ? 'block' : 'none';\r\n\t\t\tp.btn.style.position = 'absolute';\r\n\t\t\tp.btn.style.left = THIS.pickerFace + 'px';\r\n\t\t\tp.btn.style.bottom = THIS.pickerFace + 'px';\r\n\t\t\tp.btn.style.padding = '0 15px';\r\n\t\t\tp.btn.style.height = '18px';\r\n\t\t\tp.btn.style.border = THIS.pickerInset + 'px solid';\r\n\t\t\tsetBtnBorder();\r\n\t\t\tp.btn.style.color = THIS.pickerButtonColor;\r\n\t\t\tp.btn.style.font = '12px sans-serif';\r\n\t\t\tp.btn.style.textAlign = 'center';\r\n\t\t\ttry {\r\n\t\t\t\tp.btn.style.cursor = 'pointer';\r\n\t\t\t} catch(eOldIE) {\r\n\t\t\t\tp.btn.style.cursor = 'hand';\r\n\t\t\t}\r\n\t\t\tp.btn.onmousedown = function () {\r\n\t\t\t\tTHIS.hidePicker();\r\n\t\t\t};\r\n\t\t\tp.btnS.style.lineHeight = p.btn.style.height;\r\n\r\n\t\t\t// load images in optimal order\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0: var padImg = 'hs.png'; break;\r\n\t\t\t\tcase 1: var padImg = 'hv.png'; break;\r\n\t\t\t}\r\n\t\t\tp.padM.style.backgroundImage = \"url('\"+jscolor.getDir()+\"cross.gif')\";\r\n\t\t\tp.padM.style.backgroundRepeat = \"no-repeat\";\r\n\t\t\tp.sldM.style.backgroundImage = \"url('\"+jscolor.getDir()+\"arrow.gif')\";\r\n\t\t\tp.sldM.style.backgroundRepeat = \"no-repeat\";\r\n\t\t\tp.pad.style.backgroundImage = \"url('\"+jscolor.getDir()+padImg+\"')\";\r\n\t\t\tp.pad.style.backgroundRepeat = \"no-repeat\";\r\n\t\t\tp.pad.style.backgroundPosition = \"0 0\";\r\n\r\n\t\t\t// place pointers\r\n\t\t\tredrawPad();\r\n\t\t\tredrawSld();\r\n\r\n\t\t\tjscolor.picker.owner = THIS;\r\n\t\t\tdocument.getElementsByTagName('body')[0].appendChild(p.boxB);\r\n\t\t}\r\n\r\n\r\n\t\tfunction getPickerDims(o) {\r\n\t\t\tvar dims = [\r\n\t\t\t\t2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[0] +\r\n\t\t\t\t\t(o.slider ? 2*o.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0),\r\n\t\t\t\to.pickerClosable ?\r\n\t\t\t\t\t4*o.pickerInset + 3*o.pickerFace + jscolor.images.pad[1] + o.pickerButtonHeight :\r\n\t\t\t\t\t2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[1]\r\n\t\t\t];\r\n\t\t\treturn dims;\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawPad() {\r\n\t\t\t// redraw the pad pointer\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0: var yComponent = 1; break;\r\n\t\t\t\tcase 1: var yComponent = 2; break;\r\n\t\t\t}\r\n\t\t\tvar x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));\r\n\t\t\tvar y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));\r\n\t\t\tjscolor.picker.padM.style.backgroundPosition =\r\n\t\t\t\t(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +\r\n\t\t\t\t(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';\r\n\r\n\t\t\t// redraw the slider image\r\n\t\t\tvar seg = jscolor.picker.sld.childNodes;\r\n\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tvar rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);\r\n\t\t\t\t\tfor(var i=0; i<seg.length; i+=1) {\r\n\t\t\t\t\t\tseg[i].style.backgroundColor = 'rgb('+\r\n\t\t\t\t\t\t\t(rgb[0]*(1-i/seg.length)*100)+'%,'+\r\n\t\t\t\t\t\t\t(rgb[1]*(1-i/seg.length)*100)+'%,'+\r\n\t\t\t\t\t\t\t(rgb[2]*(1-i/seg.length)*100)+'%)';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tvar rgb, s, c = [ THIS.hsv[2], 0, 0 ];\r\n\t\t\t\t\tvar i = Math.floor(THIS.hsv[0]);\r\n\t\t\t\t\tvar f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);\r\n\t\t\t\t\tswitch(i) {\r\n\t\t\t\t\t\tcase 6:\r\n\t\t\t\t\t\tcase 0: rgb=[0,1,2]; break;\r\n\t\t\t\t\t\tcase 1: rgb=[1,0,2]; break;\r\n\t\t\t\t\t\tcase 2: rgb=[2,0,1]; break;\r\n\t\t\t\t\t\tcase 3: rgb=[2,1,0]; break;\r\n\t\t\t\t\t\tcase 4: rgb=[1,2,0]; break;\r\n\t\t\t\t\t\tcase 5: rgb=[0,2,1]; break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor(var i=0; i<seg.length; i+=1) {\r\n\t\t\t\t\t\ts = 1 - 1/(seg.length-1)*i;\r\n\t\t\t\t\t\tc[1] = c[0] * (1 - s*f);\r\n\t\t\t\t\t\tc[2] = c[0] * (1 - s);\r\n\t\t\t\t\t\tseg[i].style.backgroundColor = 'rgb('+\r\n\t\t\t\t\t\t\t(c[rgb[0]]*100)+'%,'+\r\n\t\t\t\t\t\t\t(c[rgb[1]]*100)+'%,'+\r\n\t\t\t\t\t\t\t(c[rgb[2]]*100)+'%)';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawSld() {\r\n\t\t\t// redraw the slider pointer\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0: var yComponent = 2; break;\r\n\t\t\t\tcase 1: var yComponent = 1; break;\r\n\t\t\t}\r\n\t\t\tvar y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));\r\n\t\t\tjscolor.picker.sldM.style.backgroundPosition =\r\n\t\t\t\t'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';\r\n\t\t}\r\n\r\n\r\n\t\tfunction isPickerOwner() {\r\n\t\t\treturn jscolor.picker && jscolor.picker.owner === THIS;\r\n\t\t}\r\n\r\n\r\n\t\tfunction blurTarget() {\r\n\t\t\tif(valueElement === target) {\r\n\t\t\t\tTHIS.importColor();\r\n\t\t\t}\r\n\t\t\tif(THIS.pickerOnfocus) {\r\n\t\t\t\tTHIS.hidePicker();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction blurValue() {\r\n\t\t\tif(valueElement !== target) {\r\n\t\t\t\tTHIS.importColor();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction setPad(e) {\r\n\t\t\tvar mpos = jscolor.getRelMousePos(e);\r\n\t\t\tvar x = mpos.x - THIS.pickerFace - THIS.pickerInset;\r\n\t\t\tvar y = mpos.y - THIS.pickerFace - THIS.pickerInset;\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;\r\n\t\t\t\tcase 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction setSld(e) {\r\n\t\t\tvar mpos = jscolor.getRelMousePos(e);\r\n\t\t\tvar y = mpos.y - THIS.pickerFace - THIS.pickerInset;\r\n\t\t\tswitch(modeID) {\r\n\t\t\t\tcase 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;\r\n\t\t\t\tcase 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction dispatchImmediateChange() {\r\n\t\t\tif (THIS.onImmediateChange) {\r\n\t\t\t\tvar callback;\r\n\t\t\t\tif (typeof THIS.onImmediateChange === 'string') {\r\n\t\t\t\t\tcallback = new Function (THIS.onImmediateChange);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcallback = THIS.onImmediateChange;\r\n\t\t\t\t}\r\n\t\t\t\tcallback.call(THIS);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tvar THIS = this;\r\n\t\tvar modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;\r\n\t\tvar abortBlur = false;\r\n\t\tvar\r\n\t\t\tvalueElement = jscolor.fetchElement(this.valueElement),\r\n\t\t\tstyleElement = jscolor.fetchElement(this.styleElement);\r\n\t\tvar\r\n\t\t\tholdPad = false,\r\n\t\t\tholdSld = false;\r\n\t\tvar\r\n\t\t\tleaveValue = 1<<0,\r\n\t\t\tleaveStyle = 1<<1,\r\n\t\t\tleavePad = 1<<2,\r\n\t\t\tleaveSld = 1<<3;\r\n\r\n\t\t// target\r\n\t\tjscolor.addEvent(target, 'focus', function() {\r\n\t\t\tif(THIS.pickerOnfocus) { THIS.showPicker(); }\r\n\t\t});\r\n\t\tjscolor.addEvent(target, 'blur', function() {\r\n\t\t\tif(!abortBlur) {\r\n\t\t\t\twindow.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);\r\n\t\t\t} else {\r\n\t\t\t\tabortBlur = false;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// valueElement\r\n\t\tif(valueElement) {\r\n\t\t\tvar updateField = function() {\r\n\t\t\t\tTHIS.fromString(valueElement.value, leaveValue);\r\n\t\t\t\tdispatchImmediateChange();\r\n\t\t\t};\r\n\t\t\tjscolor.addEvent(valueElement, 'keyup', updateField);\r\n\t\t\tjscolor.addEvent(valueElement, 'input', updateField);\r\n\t\t\tjscolor.addEvent(valueElement, 'blur', blurValue);\r\n\t\t\tvalueElement.setAttribute('autocomplete', 'off');\r\n\t\t}\r\n\r\n\t\t// styleElement\r\n\t\tif(styleElement) {\r\n\t\t\tstyleElement.jscStyle = {\r\n\t\t\t\tbackgroundImage : styleElement.style.backgroundImage,\r\n\t\t\t\tbackgroundColor : styleElement.style.backgroundColor,\r\n\t\t\t\tcolor : styleElement.style.color\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// require images\r\n\t\tswitch(modeID) {\r\n\t\t\tcase 0: jscolor.requireImage('hs.png'); break;\r\n\t\t\tcase 1: jscolor.requireImage('hv.png'); break;\r\n\t\t}\r\n\t\tjscolor.requireImage('cross.gif');\r\n\t\tjscolor.requireImage('arrow.gif');\r\n\r\n\t\tthis.importColor();\r\n\t}\r\n\r\n};\r\n\r\n\r\njscolor.install();\r\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "ShapeCarving/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "ShapeCarving/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "ShapeCarving/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "ShapeCarving/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "ShapeCarving/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "TJunctions/MIT-LICENSE.txt",
    "content": "THIS IS FOR THE FRAMEWORK CODE, NOT ACTUAL JS CODE\n\nCopyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "TJunctions/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "TJunctions/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "TJunctions/index.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>T-Junction Tester</title>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\n\t\t\t\n\t\t<script src=\"vendor/three.js/Three.js\"></script>\n\t\t<script src=\"vendor/three.js/Detector.js\"></script>\n\t\t<script src=\"vendor/three.js/Stats.js\"></script>\n\n\t\t<script src=\"vendor/threex/THREEx.screenshot.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.FullScreen.js\"></script>\n\t\t<script src=\"vendor/threex/THREEx.WindowResize.js\"></script>\n\t\t<script src=\"vendor/threex.dragpancontrols.js\"></script>\n\n\t\t<link  href=\"css/main.css\" rel=\"stylesheet\"/>\n\t</head>\n<body>\n\t<!-- three.js container -->\n    \t<div id=\"container\"></div>\n\t<!-- info on screen display -->\n\t<div id=\"info\">\n\t\t<div class=\"top\">\n\t\t\tT-Junction Experiment\n\t\t</div>\n\t\t<div class=\"bottom\" id=\"inlineDoc\" >\n\t\t\t- <i>p</i> for screenshot\n\t\t</div>\n\t  <div class=\"controls\">\n\t    <p>Top Subdivisions:</p>\n\t    <p><input type=\"range\" id=\"topsubdiv\" min=\"1\" max=\"100\" value=\"2\" /></p>\n\t    <p>Bottom Subdivisions: </p>\n\t    <p><input type=\"range\" id=\"bottomsubdiv\" min=\"1\" max=\"100\" value=\"1\" /></p>\n\t    <p>Mesh Scale: </p>\n\t    <p><input type=\"range\" id=\"meshscale\" min=\"1\" max=\"1000\" value=\"1\" /><p>\n\t    <p>Show edges: <input type=\"checkbox\" id=\"showedges\" checked=\"false\" /></p>\n\t  </div> \n\t</div> \n\t\n\t<script type=\"text/javascript\">\n\t\tvar stats, scene, renderer, composer;\n\t\tvar camera, cameraControl;\n\t\tvar texture;\n\t\tvar geometry, surfacemesh, wiremesh;\n\t\t\n\t\t\n\t\tfunction updateMesh() {\n\t\t\n\t\t  scene.remove( surfacemesh );\n\t\t  scene.remove( wiremesh );\n\t\t  \n\t\t\tgeometry\t= new THREE.Geometry();\t\t\n      geometry.vertices.length = 0;\n      geometry.faces.length = 0;\n      geometry.faceVertexUvs[0].length = 0;\n      \n      var scale = parseFloat(document.getElementById(\"meshscale\").value);\n      \n      function addQuad(v0, v1) {\n        var nv = geometry.vertices.length\n          , vlist = [ [v0[0], v0[1]], [v1[0], v0[1]], [v1[0], v1[1]], [v0[0], v1[1]] ]\n          , uvlist = []\n          , f = new THREE.Face4(nv, nv+1, nv+2, nv+3);\n        for(var i=0; i<4; ++i) {\n          geometry.vertices.push(new THREE.Vector3(scale * vlist[i][0], scale * vlist[i][1], 0));\n          uvlist.push(new THREE.UV(vlist[i][0], vlist[i][1]));\n        }\n        f.materialIndex = 0;\n        geometry.faceVertexUvs[0].push(uvlist);\n        f.color = new THREE.Color(0xffffff);\n        geometry.faces.push(f);\n      }\n      \n      var n = parseInt(document.getElementById(\"topsubdiv\").value);\n      for(var i=0; i<n; ++i) {\n        addQuad([ i/n, 0.0 ], [ (i+1)/n, 0.5 ]);\n      }\n      n = parseInt(document.getElementById(\"bottomsubdiv\").value);\n      for(var i=0; i<n; ++i) {\n        addQuad([ i/n, 0.5 ], [ (i+1)/n, 1.0 ]);\n      }\n            \n      geometry.computeFaceNormals();\n      \n      geometry.verticesNeedUpdate = true;\n      geometry.elementsNeedUpdate = true;\n      geometry.normalsNeedUpdate = true;\n      geometry.colorsNeedUpdate = true;\n      \n      geometry.computeBoundingBox();\n      geometry.computeBoundingSphere();\n      \n      var bb = geometry.boundingBox;\n      \n       //Create surface mesh\n\t\t\tvar material\t= new THREE.MeshBasicMaterial({\n\t\t    map: texture\n\t\t\t});\n\t\t\tsurfacemesh\t= new THREE.Mesh( geometry, material );\n\t\t\tsurfacemesh.doubleSided = false;\n\t\t\tvar wirematerial = new THREE.MeshBasicMaterial({\n\t\t\t    color : 0xffffff\n\t\t\t  , wireframe : true\n\t\t\t});\n\t\t\twiremesh = new THREE.Mesh(geometry, wirematerial);\n\t\t\twiremesh.doubleSided = true;\n\t\t\t\n\t\t\twiremesh.position.x = surfacemesh.position.x = -(bb.max.x + bb.min.x) / 2.0;\n      wiremesh.position.y = surfacemesh.position.y = -(bb.max.y + bb.min.y) / 2.0;\n      wiremesh.position.z = surfacemesh.position.z = -(bb.max.z + bb.min.z) / 2.0;\n      \n\t\t\tscene.add( surfacemesh );\n\t\t\tscene.add( wiremesh );\n\t\t}\n\n\t\tif( !init() )\tanimate();\n\n\t\t// init the scene\n\t\tfunction init(){\n\t\t\tif( Detector.webgl ){\n\t\t\t\trenderer = new THREE.WebGLRenderer({\n\t\t\t\t\tantialias\t\t: true,\t// to get smoother output\n\t\t\t\t\tpreserveDrawingBuffer\t: true\t// to allow screenshot\n\t\t\t\t});\n\t\t\t\trenderer.setClearColorHex( 0xBBBBBB, 1 );\n\t\t\t}else{\n\t\t\t  renderer = new THREE.CanvasRenderer();\n\t\t\t}\n\t\t\t\n\t\t\ttexture = THREE.ImageUtils.loadTexture('images/WIKI-Grass.jpg');\n\t\t\t\n\t\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t\tdocument.getElementById('container').appendChild(renderer.domElement);\n\n\t\t\t// add Stats.js - https://github.com/mrdoob/stats.js\n\t\t\tstats = new Stats();\n\t\t\tstats.domElement.style.position\t= 'absolute';\n\t\t\tstats.domElement.style.bottom\t= '0px';\n\t\t\tdocument.body.appendChild( stats.domElement );\n\n\t\t\t// create a scene\n\t\t\tscene = new THREE.Scene();\n\n\t\t\t// put a camera in the scene\n\t\t\tcamera\t= new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000 );\n\t\t\tcamera.position.set(0, 0, 40);\n\t\t\tscene.add(camera);\n\n\t\t\t// create a camera contol\n\t\t\tcameraControls\t= new THREE.TrackballControls( camera, document.getElementById('container') )\n\n\t\t\t// transparently support window resize\n\t\t\tTHREEx.WindowResize.bind(renderer, camera);\n\t\t\t// allow 'p' to make screenshot\n\t\t\tTHREEx.Screenshot.bindKey(renderer);\n\t\t\t// allow 'f' to go fullscreen where this feature is supported\n\t\t\tif( THREEx.FullScreen.available() ){\n\t\t\t\tTHREEx.FullScreen.bindKey();\t\t\n\t\t\t\tdocument.getElementById('inlineDoc').innerHTML\t+= \"- <i>f</i> for fullscreen\";\n\t\t\t}\n\n\t\t\t// here you add your objects\n\t\t\t// - you will most likely replace this part by your own\n\t\t\tvar light\t= new THREE.AmbientLight( Math.random() * 0xffffff );\n\t\t\tscene.add( light );\n\t\t\tvar light\t= new THREE.DirectionalLight( Math.random() * 0xffffff );\n\t\t\tlight.position.set( Math.random(), Math.random(), Math.random() ).normalize();\n\t\t\tscene.add( light );\n\n      \n\t\t\t//Initialize dom elements\n\t\t\tdocument.getElementById(\"topsubdiv\").onchange = updateMesh;\n\t\t\tdocument.getElementById(\"bottomsubdiv\").onchange = updateMesh;\n\t\t\tdocument.getElementById(\"meshscale\").onchange = updateMesh;\n\t\t\tdocument.getElementById(\"showedges\").checked  = false;\n\t\t\t\n\t\t\t//Update mesh\n\t\t\tupdateMesh();\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\n\t\t// animation loop\n\t\tfunction animate() {\n\n\t\t\t// loop on request animation loop\n\t\t\t// - it has to be at the begining of the function\n\t\t\t// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\t\t\trequestAnimationFrame( animate );\n\n\t\t\t// do the render\n\t\t\trender();\n\n\t\t\t// update stats\n\t\t\tstats.update();\n\t\t}\n\n\t\t// render the scene\n\t\tfunction render() {\n\t\t\t// variable which is increase by Math.PI every seconds - usefull for animation\n\t\t\tvar PIseconds\t= Date.now() * Math.PI;\n\n\t\t\t// update camera controls\n\t\t\tcameraControls.update();\n\n      wiremesh.visible = document.getElementById(\"showedges\").checked;\n\n\t\t\t// actually render the scene\n\t\t\trenderer.render( scene, camera );\n\t\t}\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "TJunctions/vendor/three.js/Detector.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nDetector = {\n\n\tcanvas : !! window.CanvasRenderingContext2D,\n\twebgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),\n\tworkers : !! window.Worker,\n\tfileapi : window.File && window.FileReader && window.FileList && window.Blob,\n\n\tgetWebGLErrorMessage : function () {\n\n\t\tvar domElement = document.createElement( 'div' );\n\n\t\tdomElement.style.fontFamily = 'monospace';\n\t\tdomElement.style.fontSize = '13px';\n\t\tdomElement.style.textAlign = 'center';\n\t\tdomElement.style.background = '#eee';\n\t\tdomElement.style.color = '#000';\n\t\tdomElement.style.padding = '1em';\n\t\tdomElement.style.width = '475px';\n\t\tdomElement.style.margin = '5em auto 0';\n\n\t\tif ( ! this.webgl ) {\n\n\t\t\tdomElement.innerHTML = window.WebGLRenderingContext ? [\n\t\t\t\t'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br />',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' ) : [\n\t\t\t\t'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\">WebGL</a>.<br/>',\n\t\t\t\t'Find out how to get it <a href=\"http://get.webgl.org/\">here</a>.'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\treturn domElement;\n\n\t},\n\n\taddGetWebGLMessage : function ( parameters ) {\n\n\t\tvar parent, id, domElement;\n\n\t\tparameters = parameters || {};\n\n\t\tparent = parameters.parent !== undefined ? parameters.parent : document.body;\n\t\tid = parameters.id !== undefined ? parameters.id : 'oldie';\n\n\t\tdomElement = Detector.getWebGLErrorMessage();\n\t\tdomElement.id = id;\n\n\t\tparent.appendChild( domElement );\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/ShaderExtras.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * ShaderExtras currently contains:\n *\n *\tscreen\n *\tconvolution\n *\tfilm\n * \tbokeh\n *  sepia\n *\tdotscreen\n *\tvignette\n *  bleachbypass\n *\tbasic\n *  dofmipmap\n *  focus\n *  triangleBlur\n *  horizontalBlur + verticalBlur\n *  horizontalTiltShift + verticalTiltShift\n *  blend\n *  fxaa\n *  luminosity\n *  colorCorrection\n *  normalmap\n *  ssao\n *  colorify\n *  unpackDepthRGBA\n */\n\nTHREE.ShaderExtras = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tFull-screen textured quad shader\n\t ------------------------------------------------------------------------- */\n\n\t'screen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------\n\t//\tConvolution shader\n\t//\t  - ported from o3d sample to WebGL / GLSL\n\t//\t\t\thttp://o3d.googlecode.com/svn/trunk/samples/convolution.html\n\t------------------------------------------------------------------------ */\n\n\t'convolution': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"uImageIncrement\" : { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\t\"cKernel\" : \t\t{ type: \"fv1\", value: [] }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25.0\",\n\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t//\"#define KERNEL_SIZE 25\",\n\t\t\t\"uniform float cKernel[ KERNEL_SIZE ];\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\t\"for( int i = 0; i < KERNEL_SIZE; i ++ ) {\",\n\n\t\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\n\t// Film grain & scanlines shader\n\n\t//\t- ported from HLSL to WebGL / GLSL\n\t//\t  http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n\n\t// Screen Space Static Postprocessor\n\t//\n\t// Produces an analogue noise overlay similar to a film grain / TV static\n\t//\n\t// Original implementation and noise algorithm\n\t// Pat 'Hawthorne' Shearon\n\t//\n\t// Optimized scanlines + noise version with intensity scaling\n\t// Georg 'Leviathan' Steinrohder\n\n\t// This version is provided under a Creative Commons Attribution 3.0 License\n\t// http://creativecommons.org/licenses/by/3.0/\n\t ------------------------------------------------------------------------- */\n\n\t'film': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse:   { type: \"t\", value: 0, texture: null },\n\t\t\ttime: \t    { type: \"f\", value: 0.0 },\n\t\t\tnIntensity: { type: \"f\", value: 0.5 },\n\t\t\tsIntensity: { type: \"f\", value: 0.05 },\n\t\t\tsCount: \t{ type: \"f\", value: 4096 },\n\t\t\tgrayscale:  { type: \"i\", value: 1 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t// control parameter\n\t\t\t\"uniform float time;\",\n\n\t\t\t\"uniform bool grayscale;\",\n\n\t\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float nIntensity;\",\n\n\t\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\t\"uniform float sIntensity;\",\n\n\t\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\t\"uniform float sCount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// sample the source\n\t\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t// make some noise\n\t\t\t\t\"float x = vUv.x * vUv.y * time *  1000.0;\",\n\t\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t\t// add noise\n\t\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t\t// get us a sine and cosine\n\t\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t\t// add scanlines\n\t\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t\t// interpolate between source and result by intensity\n\t\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t\t// convert to grayscale if desired\n\t\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor =  vec4( cResult, cTextureScreen.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader with bokeh\n\t//\tported from GLSL shader by Martins Upitis\n\t//\thttp://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n\t ------------------------------------------------------------------------- */\n\n\t'bokeh'\t: {\n\n\tuniforms: { tColor:   { type: \"t\", value: 0, texture: null },\n\t\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\t\taspect:   { type: \"f\", value: 1.0 },\n\t\t\t\taperture: { type: \"f\", value: 0.025 },\n\t\t\t\tmaxblur:  { type: \"f\", value: 1.0 },\n\t\t\t  },\n\n\tvertexShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"void main() {\",\n\n\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\"varying vec2 vUv;\",\n\n\t\"uniform sampler2D tColor;\",\n\t\"uniform sampler2D tDepth;\",\n\n\t\"uniform float maxblur;\",  \t// max blur amount\n\t\"uniform float aperture;\",\t// aperture - bigger values for shallower depth of field\n\n\t\"uniform float focus;\",\n\t\"uniform float aspect;\",\n\n\t\"void main() {\",\n\n\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\"}\"\n\n\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDepth-of-field shader using mipmaps\n\t//\t- from Matt Handley @applmak\n\t//\t- requires power-of-2 sized render target with enabled mipmaps\n\t ------------------------------------------------------------------------- */\n\n\t'dofmipmap': {\n\n\t\tuniforms: {\n\n\t\t\ttColor:   { type: \"t\", value: 0, texture: null },\n\t\t\ttDepth:   { type: \"t\", value: 1, texture: null },\n\t\t\tfocus:    { type: \"f\", value: 1.0 },\n\t\t\tmaxblur:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float focus;\",\n\t\t\t\"uniform float maxblur;\",\n\n\t\t\t\"uniform sampler2D tColor;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\t\"gl_FragColor = col;\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSepia tone shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'sepia': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tamount:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float amount;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tDot screen shader\n\t//  - based on glfx.js sepia shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\t ------------------------------------------------------------------------- */\n\n\t'dotscreen': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\ttSize:    { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\tcenter:   { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\tangle:\t  { type: \"f\", value: 1.57 },\n\t\t\tscale:\t  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec2 center;\",\n\t\t\t\"uniform float angle;\",\n\t\t\t\"uniform float scale;\",\n\t\t\t\"uniform vec2 tSize;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float pattern() {\",\n\n\t\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------------\n\t//\tVignette shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t ------------------------------------------------------------------------------------------------ */\n\n\t'vignette': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\toffset:   { type: \"f\", value: 1.0 },\n\t\t\tdarkness: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float offset;\",\n\t\t\t\"uniform float darkness;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Eskil's vignette\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t\t/*\n\t\t\t\t// alternative version from glfx.js\n\t\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\t\"gl_FragColor = color;\",\n\t\t\t\t*/\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n\t//\t- based on Nvidia example\n\t//\t\thttp://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n\t ------------------------------------------------------------------------- */\n\n\t'bleachbypass': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tFocus shader\n\t//\t- based on PaintEffect postprocess from ro.me\n\t//\t\thttp://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'focus': {\n\n\t\tuniforms : {\n\n\t\t\t\"tDiffuse\": \t\t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"screenWidth\": \t\t{ type: \"f\", value: 1024 },\n\t\t\t\"screenHeight\": \t{ type: \"f\", value: 1024 },\n\t\t\t\"sampleDistance\": \t{ type: \"f\", value: 0.94 },\n\t\t\t\"waveFactor\": \t\t{ type: \"f\", value: 0.00125 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float screenWidth;\",\n\t\t\t\"uniform float screenHeight;\",\n\t\t\t\"uniform float sampleDistance;\",\n\t\t\t\"uniform float waveFactor;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\t\"float sample_dist, f;\",\n\t\t\t\t\"vec2 vin;\",\n\t\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\t\"add += color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\t\"vec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tTriangle blur shader\n\t//  - based on glfx.js triangle blur shader\n\t//\t\thttps://github.com/evanw/glfx.js\n\n\t// \tA basic blur filter, which convolves the image with a\n\t// \tpyramid filter. The pyramid filter is separable and is applied as two\n\t//  perpendicular triangle filters.\n\t ------------------------------------------------------------------------- */\n\n\t'triangleBlur': {\n\n\n\t\tuniforms : {\n\n\t\t\t\"texture\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"delta\": \t{ type: \"v2\", value:new THREE.Vector2( 1, 1 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tSimple test shader\n\t ------------------------------------------------------------------------- */\n\n\t'basic': {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tTwo pass Gaussian blur filter (horizontal and vertical blur shaders)\n\t//\t- described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n\t//\t  and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \tvUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalBlur': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t  ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* --------------------------------------------------------------------------------------------------\n\t//\tSimple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n\t//\n\t//\t- 9 samples per pass\n\t//\t- standard deviation 2.7\n\t//\t- \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n\t//\t- \"r\" parameter control where \"focused\" horizontal line lies\n\t -------------------------------------------------------------------------------------------------- */\n\n\t'horizontalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"h\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float h;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, \t\t  \t vUv.y ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t'verticalTiltShift': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": { type: \"t\", value: 0, texture: null },\n\t\t\t\"v\": \t\t{ type: \"f\", value: 1.0 / 512.0 },\n\t\t\t\"r\": \t\t{ type: \"f\", value: 0.35 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform float v;\",\n\t\t\t\"uniform float r;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y\t\t\t   ) ) * 0.1633;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\t\"}\"\n\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tBlend two textures\n\t ------------------------------------------------------------------------- */\n\n\t'blend': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse1: { type: \"t\", value: 0, texture: null },\n\t\t\ttDiffuse2: { type: \"t\", value: 1, texture: null },\n\t\t\tmixRatio:  { type: \"f\", value: 0.5 },\n\t\t\topacity:   { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\t\t\t\"uniform float mixRatio;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNVIDIA FXAA by Timothy Lottes\n\t//\t\thttp://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n\t//\t- WebGL port by @supereggbert\n\t//\t\thttp://www.glge.org/demos/fxaa/\n\t ------------------------------------------------------------------------- */\n\n\t'fxaa': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": \t{ type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 )  }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec2 resolution;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#define FXAA_REDUCE_MIN   (1.0/128.0)\",\n\t\t\t\"#define FXAA_REDUCE_MUL   (1.0/8.0)\",\n\t\t\t\"#define FXAA_SPAN_MAX     8.0\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\t\"vec3 rgbM  = texture2D( tDiffuse,  gl_FragCoord.xy  * resolution ).xyz;\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\t\"float lumaM  = dot( rgbM,  luma );\",\n\t\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\t\"vec2 dir;\",\n\t\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\t\"dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),\",\n\t\t\t\t\t  \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\n\t\t\t\t\"vec3 rgbA = 0.5 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );\",\n\n\t\t\t\t\"vec3 rgbB = rgbA * 0.5 + 0.25 * (\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * -0.5 ).xyz +\",\n\t\t\t\t\t\"texture2D( tDiffuse, gl_FragCoord.xy  * resolution + dir * 0.5 ).xyz );\",\n\n\t\t\t\t\"float lumaB = dot( rgbB, luma );\",\n\n\t\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbA, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( rgbB, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\"),\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tLuminosity\n\t//\thttp://en.wikipedia.org/wiki/Luminosity\n\t ------------------------------------------------------------------------- */\n\n\t'luminosity': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColor correction\n\t ------------------------------------------------------------------------- */\n\n\t'colorCorrection': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\" : \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"powRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\t\"mulRGB\" :\t\t{ type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform vec3 powRGB;\",\n\t\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tNormal map shader\n\t//\t- compute normals from heightmap\n\t ------------------------------------------------------------------------- */\n\n\t'normalmap': {\n\n\t\tuniforms: {\n\n\t\t\t\"heightMap\"\t: { type: \"t\", value: 0, texture: null },\n\t\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"scale\"\t\t: { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"height\"\t: { type: \"f\", value: 0.05 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float height;\",\n\t\t\t\"uniform vec2 resolution;\",\n\t\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tScreen-space ambient occlusion shader\n\t//\t- ported from\n\t//\t\tSSAO GLSL shader v1.2\n\t//\t\tassembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n\t//\t\toriginal technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n\t//\t- modifications\n\t//\t\t- modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n\t//\t\t- made fog more compatible with three.js linear fog\n\t//\t\t- refactoring and optimizations\n\t ------------------------------------------------------------------------- */\n\n\t'ssao': {\n\n\t\tuniforms: {\n\n\t\t\t\"tDiffuse\": \t{ type: \"t\", value: 0, texture: null },\n\t\t\t\"tDepth\":   \t{ type: \"t\", value: 1, texture: null },\n\t\t\t\"size\": \t\t{ type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\t\"cameraNear\":\t{ type: \"f\", value: 1 },\n\t\t\t\"cameraFar\":\t{ type: \"f\", value: 100 },\n\t\t\t\"fogNear\":\t\t{ type: \"f\", value: 5 },\n\t\t\t\"fogFar\":\t\t{ type: \"f\", value: 100 },\n\t\t\t\"fogEnabled\":\t{ type: \"i\", value: 0 },\n\t\t\t\"aoClamp\":\t\t{ type: \"f\", value: 0.3 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float cameraNear;\",\n\t\t\t\"uniform float cameraFar;\",\n\n\t\t\t\"uniform float fogNear;\",\n\t\t\t\"uniform float fogFar;\",\n\n\t\t\t\"uniform bool fogEnabled;\",\n\n\t\t\t\"uniform vec2 size;\",\t\t// texture width, height\n\t\t\t\"uniform float aoClamp;\", \t// depth clamp - reduces haloing at screen edges\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t//\"#define PI 3.14159265\",\n\t\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\t\"#define EULER 2.718281828459045\",\n\n\t\t\t// helpers\n\n\t\t\t\"float width = size.x;\", \t// texture width\n\t\t\t\"float height = size.y;\", \t// texture height\n\n\t\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t\t// user variables\n\n\t\t\t\"const int samples = 8;\", \t\t// ao sample count\n\t\t\t\"const float radius = 5.0;\", \t// ao radius\n\n\t\t\t\"const bool useNoise = false;\", \t\t // use noise instead of pattern for sample dithering\n\t\t\t\"const float noiseAmount = 0.0002;\", // dithering amount\n\n\t\t\t\"const float diffArea = 0.4;\", \t\t// self-shadowing reduction\n\t\t\t\"const float gDisplace = 0.4;\", \t// gauss bell center\n\n\t\t\t\"const bool onlyAO = false;\", \t\t// use only ambient occlusion pass?\n\t\t\t\"const float lumInfluence = 0.3;\",  // how much luminance affects occlusion\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t// generating noise / pattern texture for dithering\n\n\t\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\t\"vec2 noise;\",\n\n\t\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return ( noise * 2.0  - 1.0 ) * noiseAmount;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float doFog() {\",\n\n\t\t\t\t\"float zdepth = unpackDepth( texture2D( tDepth, vUv ) );\",\n\t\t\t\t\"float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );\",\n\n\t\t\t\t\"return smoothstep( fogNear, fogFar, depth );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t\t//\"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\t\"}\",\n\n\t\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\t\"float garea = 2.0;\", \t\t\t\t\t\t // gauss bell width\n\t\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"far = 1;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\t\"return gauss;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\t\"int far = 0;\",\n\t\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return temp1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\t\"float w = ( 1.0 / width )  / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\t\"float pw;\",\n\t\t\t\t\"float ph;\",\n\n\t\t\t\t\"float ao;\",\n\n\t\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\t\"float l = 0.0;\",\n\n\t\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\t\"pw = cos( l ) * r;\",\n\t\t\t\t\t\"ph = sin( l ) * r;\",\n\t\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"ao /= float( samples );\",\n\t\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\t\"if ( fogEnabled ) {\",\n\n\t\t\t\t\t\"ao = mix( ao, 1.0, doFog() );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tColorify shader\n\t ------------------------------------------------------------------------- */\n\n\t'colorify': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\tcolor:    { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 color;\",\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tUnpack RGBA depth shader\n\t//\t- show RGBA encoded depth as monochrome color\n\t ------------------------------------------------------------------------- */\n\n\t'unpackDepthRGBA': {\n\n\t\tuniforms: {\n\n\t\t\ttDiffuse: { type: \"t\", value: 0, texture: null },\n\t\t\topacity:  { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = vec2( uv.x, 1.0 - uv.y );\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t// RGBA depth\n\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\t\"return depth;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t// METHODS\n\n\tbuildKernel: function( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/Stats.js",
    "content": "// stats.js r8 - http://github.com/mrdoob/stats.js\nvar Stats=function(){var h,a,n=0,o=0,i=Date.now(),u=i,p=i,l=0,q=1E3,r=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,s=1E3,t=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement(\"div\");h.style.cursor=\"pointer\";h.style.width=\"80px\";h.style.opacity=\"0.9\";h.style.zIndex=\"10001\";h.addEventListener(\"mousedown\",function(a){a.preventDefault();n=(n+1)%2;n==0?(e.style.display=\"block\",d.style.display=\"none\"):(e.style.display=\"none\",d.style.display=\"block\")},!1);e=document.createElement(\"div\");e.style.textAlign=\n\"left\";e.style.lineHeight=\"1.2em\";e.style.backgroundColor=\"rgb(\"+Math.floor(b[0][0]/2)+\",\"+Math.floor(b[0][1]/2)+\",\"+Math.floor(b[0][2]/2)+\")\";e.style.padding=\"0 0 3px 3px\";h.appendChild(e);j=document.createElement(\"div\");j.style.fontFamily=\"Helvetica, Arial, sans-serif\";j.style.fontSize=\"9px\";j.style.color=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";j.style.fontWeight=\"bold\";j.innerHTML=\"FPS\";e.appendChild(j);f=document.createElement(\"div\");f.style.position=\"relative\";f.style.width=\"74px\";f.style.height=\n\"30px\";f.style.backgroundColor=\"rgb(\"+b[1][0]+\",\"+b[1][1]+\",\"+b[1][2]+\")\";for(e.appendChild(f);f.children.length<74;)a=document.createElement(\"span\"),a.style.width=\"1px\",a.style.height=\"30px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+b[0][0]+\",\"+b[0][1]+\",\"+b[0][2]+\")\",f.appendChild(a);d=document.createElement(\"div\");d.style.textAlign=\"left\";d.style.lineHeight=\"1.2em\";d.style.backgroundColor=\"rgb(\"+Math.floor(c[0][0]/2)+\",\"+Math.floor(c[0][1]/2)+\",\"+Math.floor(c[0][2]/2)+\")\";d.style.padding=\n\"0 0 3px 3px\";d.style.display=\"none\";h.appendChild(d);k=document.createElement(\"div\");k.style.fontFamily=\"Helvetica, Arial, sans-serif\";k.style.fontSize=\"9px\";k.style.color=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";k.style.fontWeight=\"bold\";k.innerHTML=\"MS\";d.appendChild(k);g=document.createElement(\"div\");g.style.position=\"relative\";g.style.width=\"74px\";g.style.height=\"30px\";g.style.backgroundColor=\"rgb(\"+c[1][0]+\",\"+c[1][1]+\",\"+c[1][2]+\")\";for(d.appendChild(g);g.children.length<74;)a=document.createElement(\"span\"),\na.style.width=\"1px\",a.style.height=Math.random()*30+\"px\",a.style.cssFloat=\"left\",a.style.backgroundColor=\"rgb(\"+c[0][0]+\",\"+c[0][1]+\",\"+c[0][2]+\")\",g.appendChild(a);return{domElement:h,update:function(){i=Date.now();m=i-u;s=Math.min(s,m);t=Math.max(t,m);k.textContent=m+\" MS (\"+s+\"-\"+t+\")\";var a=Math.min(30,30-m/200*30);g.appendChild(g.firstChild).style.height=a+\"px\";u=i;o++;if(i>p+1E3)l=Math.round(o*1E3/(i-p)),q=Math.min(q,l),r=Math.max(r,l),j.textContent=l+\" FPS (\"+q+\"-\"+r+\")\",a=Math.min(30,30-l/\n100*30),f.appendChild(f.firstChild).style.height=a+\"px\",p=i,o=0}}};\n\n"
  },
  {
    "path": "TJunctions/vendor/three.js/Three.js",
    "content": "// Three.js - http://github.com/mrdoob/three.js\n'use strict';var THREE=THREE||{REVISION:\"49\"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array);\n(function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"];window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"]}if(!window.requestAnimationFrame)window.requestAnimationFrame=function(b){var c=Date.now(),f=Math.max(0,16-(c-a)),g=window.setTimeout(function(){b(c+f)},f);a=c+f;return g};if(!window.cancelAnimationFrame)window.cancelAnimationFrame=\nfunction(a){clearTimeout(a)}})();THREE.Clock=function(a){this.autoStart=a!==void 0?a:true;this.elapsedTime=this.oldTime=this.startTime=0;this.running=false};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=true};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=false};THREE.Clock.prototype.getElapsedTime=function(){return this.elapsedTime=this.elapsedTime+this.getDelta()};\nTHREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime=this.elapsedTime+a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);\nthis.b=Math.sqrt(this.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else{d=Math.floor(a*6);e=a*6-d;a=c*(1-b);f=c*(1-b*e);b=c*(1-b*(1-e));switch(d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c;this.g=b;this.b=a}}return this},setHex:function(a){a=\nMath.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return\"rgb(\"+Math.floor(this.r*255)+\",\"+Math.floor(this.g*255)+\",\"+Math.floor(this.b*255)+\")\"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x=\nthis.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)},\nlerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+\na;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y=\nthis.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,\na).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b=\nthis.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x=\nthis.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())},\nnormalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};\nTHREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};\nTHREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;\nTHREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,\nl=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),\na.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q<r;q++){b=t.faces[q];l.copy(this.origin);k.copy(this.direction);C=a.matrixWorld;p=C.multiplyVector3(p.copy(b.centroid)).subSelf(l);m=a.matrixRotationWorld.multiplyVector3(m.copy(b.normal));s=k.dot(m);if(!(Math.abs(s)<e)){i=m.dot(p)/s;if(!(i<0)&&(a.doubleSided||(a.flipSided?\ns>0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(),\nface:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(function(a,b){return a.distance-b.distance});return b};var q=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3,u,t,y,s,w,H,E,z,v,A,J};\nTHREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,k,p){h=false;b=f;c=g;d=k;e=p;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?\ne:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=f<k?f<m?f:m:k<m?k:m;c=g<p?g<o?g:o:p<o?p:o;d=f>k?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=f<k?f<m?f<b?f:b:m<b?m:b:k<m?k<b?k:b:m<b?m:b;c=g<p?g<o?g<c?g:c:o<c?o:c:p<o?p<c?p:c:o<c?o:c;d=f>k?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();\nd=d>f.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}};\nTHREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return a<0?-1:a>0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn(\"Matrix3.getInverse(): determinant == 0\");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this},\ntranspose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4],\nH=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this,\na)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=\nb[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,\nd=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7],\nn=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2];\na[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13],\na[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q=\nc[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p-\ne*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case \"YXZ\":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g*\nj;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case \"ZXY\":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case \"ZYX\":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case \"YZX\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case \"XZY\":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j;\nc[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements,\ne=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;\nc.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;\nb[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*\nd+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]=\nk*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,\ne=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]=\no*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},\nmakeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h-\nd*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,\nb,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;\nTHREE.Matrix4.__m2=new THREE.Matrix4;\nTHREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=\"XYZ\";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=\ntrue;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};\nTHREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,\nthis._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=\nthis.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b){e=e.getChildByName(a,b);if(e!==void 0)return e}}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,\nthis.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z))}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<\nc;b++)this.children[b].updateMatrixWorld(a)}};THREE.Object3DCount=0;\nTHREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=l[j]=l[j]||new THREE.RenderableVertex;j++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-\nd);return true}var e,f,g=[],h,j,l=[],k,p,m=[],o,q=[],n,r,u=[],t,y,s=[],w={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,E=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,A=new THREE.Frustum,J=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);\nz.multiply(b.matrixWorld,b.projectionMatrixInverse);z.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||A.contains(b))){H.copy(b.matrixWorld.getPosition());\nz.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){H.copy(b.matrixWorld.getPosition());z.multiplyVector3(H);e=a();e.object=b;e.z=H.z;w.sprites.push(e)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,f){var g=e.near,G=e.far,i=false,H,U,C,Y,F,ea,fa,ia,O,Q,Z,$,ha,Ma,Ka;y=r=o=p=0;w.elements.length=0;if(e.parent===\nvoid 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);A.setFromMatrix(z);w=this.projectGraph(a,false);a=0;for(H=w.objects.length;a<H;a++){O=w.objects[a].object;Q=O.matrixWorld;j=0;if(O instanceof THREE.Mesh){Z=O.geometry;$=O.geometry.materials;Y=Z.vertices;ha=Z.faces;Ma=Z.faceVertexUvs;Z=O.matrixRotationWorld.extractRotation(Q);U=0;for(C=\nY.length;U<C;U++){h=b();h.positionWorld.copy(Y[U]);Q.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<G}Y=0;for(U=ha.length;Y<U;Y++){C=ha[Y];if(C instanceof THREE.Face3){F=l[C.a];ea=l[C.b];fa=l[C.c];if(F.visible&&ea.visible&&fa.visible){i=(fa.positionScreen.x-F.positionScreen.x)*\n(ea.positionScreen.y-F.positionScreen.y)-(fa.positionScreen.y-F.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){ia=m[p]=m[p]||new THREE.RenderableFace3;p++;k=ia;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa)}else continue}else continue}else if(C instanceof THREE.Face4){F=l[C.a];ea=l[C.b];fa=l[C.c];ia=l[C.d];if(F.visible&&ea.visible&&fa.visible&&ia.visible){i=(ia.positionScreen.x-F.positionScreen.x)*(ea.positionScreen.y-F.positionScreen.y)-(ia.positionScreen.y-\nF.positionScreen.y)*(ea.positionScreen.x-F.positionScreen.x)<0||(ea.positionScreen.x-fa.positionScreen.x)*(ia.positionScreen.y-fa.positionScreen.y)-(ea.positionScreen.y-fa.positionScreen.y)*(ia.positionScreen.x-fa.positionScreen.x)<0;if(O.doubleSided||i!=O.flipSided){Ka=q[o]=q[o]||new THREE.RenderableFace4;o++;k=Ka;k.v1.copy(F);k.v2.copy(ea);k.v3.copy(fa);k.v4.copy(ia)}else continue}else continue}k.normalWorld.copy(C.normal);!i&&(O.flipSided||O.doubleSided)&&k.normalWorld.negate();Z.multiplyVector3(k.normalWorld);\nk.centroidWorld.copy(C.centroid);Q.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);z.multiplyVector3(k.centroidScreen);fa=C.vertexNormals;F=0;for(ea=fa.length;F<ea;F++){ia=k.vertexNormalsWorld[F];ia.copy(fa[F]);!i&&(O.flipSided||O.doubleSided)&&ia.negate();Z.multiplyVector3(ia)}F=0;for(ea=Ma.length;F<ea;F++)if(Ka=Ma[F][Y]){fa=0;for(ia=Ka.length;fa<ia;fa++)k.uvs[F][fa]=Ka[fa]}k.material=O.material;k.faceMaterial=C.materialIndex!==null?$[C.materialIndex]:null;k.z=k.centroidScreen.z;\nw.elements.push(k)}}else if(O instanceof THREE.Line){v.multiply(z,Q);Y=O.geometry.vertices;F=b();F.positionScreen.copy(Y[0]);v.multiplyVector4(F.positionScreen);Q=O.type===THREE.LinePieces?2:1;U=1;for(C=Y.length;U<C;U++){F=b();F.positionScreen.copy(Y[U]);v.multiplyVector4(F.positionScreen);if(!((U+1)%Q>0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J);\nn.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a<H;a++){O=w.sprites[a].object;Q=O.matrixWorld;if(O instanceof THREE.Particle){E.set(Q.elements[12],Q.elements[13],Q.elements[14],1);z.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));\nt.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);\nthis.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x):\nMath.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=\nMath.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=\nc*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}};\nTHREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\")};\nTHREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};\nTHREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var a=new THREE.Face4(this.a,this.b,this.c,this.d);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();\nreturn a}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},lerpSelf:function(a,b){this.u=this.u+(a.u-this.u)*b;this.v=this.v+(a.v-this.v)*b;return this},clone:function(){return new THREE.UV(this.u,this.v)}};\nTHREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=false};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a);for(var c=0,d=this.vertices.length;c<d;c++)a.multiplyVector3(this.vertices[c]);c=0;for(d=this.faces.length;c<d;c++){var e=this.faces[c];b.multiplyVector3(e.normal);for(var f=0,g=e.vertexNormals.length;f<g;f++)b.multiplyVector3(e.vertexNormals[f]);a.multiplyVector3(e.centroid)}},computeCentroids:function(){var a,b,c;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];c.centroid.set(0,\n0,0);if(c instanceof THREE.Face3){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.divideScalar(3)}else if(c instanceof THREE.Face4){c.centroid.addSelf(this.vertices[c.a]);c.centroid.addSelf(this.vertices[c.b]);c.centroid.addSelf(this.vertices[c.c]);c.centroid.addSelf(this.vertices[c.d]);c.centroid.divideScalar(4)}}},computeFaceNormals:function(){var a,b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a<\nb;a++){c=this.faces[a];d=this.vertices[c.a];e=this.vertices[c.b];f=this.vertices[c.c];g.sub(f,e);h.sub(d,e);g.crossSelf(h);g.isZero()||g.normalize();c.normal.copy(g)}},computeVertexNormals:function(){var a,b,c,d;if(this.__tmpVertices===void 0){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(b=this.vertices.length;a<b;a++)d[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];\nelse if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(b=this.vertices.length;a<b;a++)d[a].set(0,0,0)}a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal)}else if(c instanceof THREE.Face4){d[c.a].addSelf(c.normal);d[c.b].addSelf(c.normal);d[c.c].addSelf(c.normal);d[c.d].addSelf(c.normal)}}a=0;\nfor(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.__originalFaceNormal?\ne.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=\n[];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,j,l;c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];j=new THREE.Vector3;l=e instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(j);h.push(l)}}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];\nj=g.faceNormals[c];l=g.vertexNormals[c];j.copy(e.normal);if(e instanceof THREE.Face3){l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2])}else{l.a.copy(e.vertexNormals[0]);l.b.copy(e.vertexNormals[1]);l.c.copy(e.vertexNormals[2]);l.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,F){h=a.vertices[b];j=a.vertices[c];\nl=a.vertices[d];k=g[e];p=g[f];m=g[F];o=j.x-h.x;q=l.x-h.x;n=j.y-h.y;r=l.y-h.y;u=j.z-h.z;t=l.z-h.z;y=p.u-k.u;s=m.u-k.u;w=p.v-k.v;H=m.v-k.v;E=1/(y*H-s*w);J.set((H*o-w*q)*E,(H*n-w*r)*E,(H*u-w*t)*E);K.set((y*q-s*o)*E,(y*r-s*n)*E,(y*t-s*u)*E);v[b].addSelf(J);v[c].addSelf(J);v[d].addSelf(J);A[b].addSelf(K);A[c].addSelf(K);A[d].addSelf(K)}var b,c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v=[],A=[],J=new THREE.Vector3,K=new THREE.Vector3,R=new THREE.Vector3,P=new THREE.Vector3,D=new THREE.Vector3;b=0;for(c=\nthis.vertices.length;b<c;b++){v[b]=new THREE.Vector3;A[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var M=[\"a\",\"b\",\"c\",\"d\"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){D.copy(f.vertexNormals[d]);e=f[M[d]];z=v[e];R.copy(z);R.subSelf(D.multiplyScalar(D.dot(z))).normalize();\nP.cross(f.vertexNormals[d],z);e=P.dot(A[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=\na.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*\ne),Math.round(d.y*e),Math.round(d.z*e)].join(\"_\");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e[\"abcd\"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=\nthis.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,j,l,k,p,m;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:\nf+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],j=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++){b=\na/c;d=this.getPoint(b);g.copy(d);j=j+g.distanceTo(f);f.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=e){h[b]=j;e=b}}h[h.length]=j;return{chunks:h,total:j}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],j=new THREE.Vector3,k=this.getLength();h.push(j.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];g=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++){d=e+c*(1/g)*(f-e);d=this.getPoint(d);\nh.push(j.copy(d).clone())}h.push(j.copy(this.points[b]).clone())}this.points=h}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.lookAt=function(a){this.matrix.lookAt(this.position,a,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)};\nTHREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=e!==void 0?e:0.1;this.far=f!==void 0?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=new THREE.Camera;THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=a!==void 0?a:50;this.aspect=b!==void 0?b:1;this.near=c!==void 0?c:0.1;this.far=d!==void 0?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=new THREE.Camera;THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){this.fov=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(this.fov*Math.PI/360)*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=new THREE.Object3D;THREE.Light.prototype.constructor=THREE.Light;THREE.Light.prototype.supr=THREE.Object3D.prototype;THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;\nTHREE.DirectionalLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;\nthis.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,0.99,0.998];this.shadowCascadeFarZ=[0.99,0.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,0,0);this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0};THREE.PointLight.prototype=new THREE.Light;THREE.PointLight.prototype.constructor=THREE.PointLight;\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=b!==void 0?b:1;this.distance=c!==void 0?c:0;this.angle=d!==void 0?d:Math.PI/2;this.exponent=e!==void 0?e:10;this.onlyShadow=this.castShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=\nthis.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=new THREE.Light;THREE.SpotLight.prototype.constructor=THREE.SpotLight;THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/\na.total).toFixed(0)+\"%\"):b+((a.loaded/1E3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");a.pop();return(a.length<1?\".\":a.join(\"/\"))+\"/\"},initMaterials:function(a,b,c){a.materials=[];for(var d=0;d<b.length;++d)a.materials[d]=THREE.Loader.prototype.createMaterial(b[d],c)},hasNormals:function(a){var b,c,d=a.materials.length;for(c=0;c<d;c++){b=a.materials[c];if(b instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(a,b){function c(a){a=\nMath.log(a)/Math.LN2;return Math.floor(a)==a}function d(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function e(a,b){var e=new Image;e.onload=function(){if(!c(this.width)||!c(this.height)){var b=d(this.width),e=d(this.height);a.image.width=b;a.image.height=e;a.image.getContext(\"2d\").drawImage(this,0,0,b,e)}else a.image=this;a.needsUpdate=true};e.crossOrigin=h.crossOrigin;e.src=b}function f(a,c,d,f,g,h){var j=document.createElement(\"canvas\");a[c]=new THREE.Texture(j);a[c].sourceFile=\nd;if(f){a[c].repeat.set(f[0],f[1]);if(f[0]!=1)a[c].wrapS=THREE.RepeatWrapping;if(f[1]!=1)a[c].wrapT=THREE.RepeatWrapping}g&&a[c].offset.set(g[0],g[1]);if(h){f={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(f[h[0]]!==void 0)a[c].wrapS=f[h[0]];if(f[h[1]]!==void 0)a[c].wrapT=f[h[1]]}e(a[c],b+\"/\"+d)}function g(a){return(a[0]*255<<16)+(a[1]*255<<8)+a[2]*255}var h=this,j=\"MeshLambertMaterial\",l={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,wireframe:a.wireframe};\nif(a.shading){var k=a.shading.toLowerCase();k===\"phong\"?j=\"MeshPhongMaterial\":k===\"basic\"&&(j=\"MeshBasicMaterial\")}if(a.blending!==void 0&&THREE[a.blending]!==void 0)l.blending=THREE[a.blending];if(a.transparent!==void 0||a.opacity<1)l.transparent=a.transparent;if(a.depthTest!==void 0)l.depthTest=a.depthTest;if(a.depthWrite!==void 0)l.depthWrite=a.depthWrite;if(a.vertexColors!==void 0)if(a.vertexColors==\"face\")l.vertexColors=THREE.FaceColors;else if(a.vertexColors)l.vertexColors=THREE.VertexColors;\nif(a.colorDiffuse)l.color=g(a.colorDiffuse);else if(a.DbgColor)l.color=a.DbgColor;if(a.colorSpecular)l.specular=g(a.colorSpecular);if(a.colorAmbient)l.ambient=g(a.colorAmbient);if(a.transparency)l.opacity=a.transparency;if(a.specularCoef)l.shininess=a.specularCoef;a.mapDiffuse&&b&&f(l,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap);a.mapLight&&b&&f(l,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap);a.mapNormal&&b&&f(l,\"normalMap\",a.mapNormal,a.mapNormalRepeat,\na.mapNormalOffset,a.mapNormalWrap);a.mapSpecular&&b&&f(l,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap);if(a.mapNormal){j=THREE.ShaderUtils.lib.normal;k=THREE.UniformsUtils.clone(j.uniforms);k.tNormal.texture=l.normalMap;if(a.mapNormalFactor)k.uNormalScale.value=a.mapNormalFactor;if(l.map){k.tDiffuse.texture=l.map;k.enableDiffuse.value=true}if(l.specularMap){k.tSpecular.texture=l.specularMap;k.enableSpecular.value=true}if(l.lightMap){k.tAO.texture=l.lightMap;\nk.enableAO.value=true}k.uDiffuseColor.value.setHex(l.color);k.uSpecularColor.value.setHex(l.specular);k.uAmbientColor.value.setHex(l.ambient);k.uShininess.value=l.shininess;if(l.opacity!==void 0)k.uOpacity.value=l.opacity;l=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:k,lights:true,fog:true})}else l=new THREE[j](l);if(a.DbgName!==void 0)l.name=a.DbgName;return l}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};\nTHREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.constructor=THREE.BinaryLoader;THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c?c:this.extractUrlBase(a),d=d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)};\nTHREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error(\"THREE.BinaryLoader: Couldn't load [\"+b+\"] [\"+g.status+\"]\")};g.open(\"GET\",b,true);g.overrideMimeType&&g.overrideMimeType(\"text/plain; charset=x-user-defined\");g.setRequestHeader(\"Content-Type\",\"text/plain\");g.send(null)};\nTHREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+\"/\"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error(\"THREE.BinaryLoader: Couldn't load [\"+g+\"] [\"+f.status+\"]\");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader(\"Content-Length\"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader(\"Content-Length\"))};\nf.open(\"GET\",g,true);f.responseType=\"arraybuffer\";f.send(null)};\nTHREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s;function w(a){return a%4?4-a%4:0}function H(a,b){return(new Uint8Array(a,b,1))[0]}function E(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=G[e*2];e=G[e*2+1];i=G[f*2];j=G[f*2+1];f=G[g*2];k=G[g*2+1];g=P.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(i,j));m.push(new THREE.UV(f,\nk));g.push(m)}}function v(b,c){var d,e,f,g,h,i,j,k,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];i=G[e*2];e=G[e*2+1];j=G[f*2];l=G[f*2+1];k=G[g*2];m=G[g*2+1];g=G[h*2];f=G[h*2+1];h=P.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,e));o.push(new THREE.UV(j,l));o.push(new THREE.UV(k,m));o.push(new THREE.UV(g,f));h.push(o)}}function A(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=i[d];\nP.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function J(b,c,d){for(var e,f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=j[d];P.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}}function K(b,c,d,e){for(var f,g,h,i,j,k,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];j=d[e*3];k=d[e*3+1];l=d[e*3+2];i=m[e];var n=M[k*3],o=M[k*3+1];k=M[k*3+2];var p=M[l*3],\nq=M[l*3+1];l=M[l*3+2];P.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[j*3],M[j*3+1],M[j*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,l)],null,i))}}function R(b,c,d,e){for(var f,g,h,i,j,k,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];i=c[e*4+3];k=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];j=o[e];var p=M[l*3],q=M[l*3+1];l=M[l*3+2];var r=M[m*3],s=M[m*3+1];m=M[m*3+2];var t=M[n*3],u=M[n*3+1];n=M[n*3+2];P.faces.push(new THREE.Face4(f,\ng,h,i,[new THREE.Vector3(M[k*3],M[k*3+1],M[k*3+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,m),new THREE.Vector3(t,u,n)],null,j))}}var P=this,D=0,M=[],G=[],i,T,U;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(P,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d=\"\",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,D,12);c=H(a,D+12);H(a,D+13);H(a,D+14);H(a,D+15);e=H(a,D+16);j=H(a,D+17);l=H(a,D+18);k=H(a,D+19);p=E(a,D+20);m=E(a,D+20+4);o=E(a,D+20+8);b=E(a,D+20+12);q=\nE(a,D+20+16);n=E(a,D+20+20);r=E(a,D+20+24);u=E(a,D+20+28);t=E(a,D+20+32);y=E(a,D+20+36);s=E(a,D+20+40);D=D+c;c=e*3+k;U=e*4+k;i=b*c;T=q*(c+j*3);e=n*(c+l*3);k=r*(c+j*3+l*3);c=u*U;j=t*(U+j*4);l=y*(U+l*4);D=D+function(b){var b=new Float32Array(a,b,p*3),c,d,e,f;for(c=0;c<p;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];P.vertices.push(new THREE.Vector3(d,e,f))}return p*3*Float32Array.BYTES_PER_ELEMENT}(D);D=D+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.push(d/\n127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(D);D=D+w(m*3);D=D+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(D);i=D+i+w(b*2);T=i+T+w(q*2);e=T+e+w(n*2);k=e+k+w(r*2);c=k+c+w(u*2);j=c+j+w(t*2);l=j+l+w(y*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;A(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(T);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3,c=b+\nr*Uint32Array.BYTES_PER_ELEMENT*3;K(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);z(r,c)}})(e);(function(a){if(y){var b=a+y*Uint32Array.BYTES_PER_ELEMENT*4;J(y,a,b+y*Uint32Array.BYTES_PER_ELEMENT*4);v(y,b)}})(j);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(l);b&&A(b,D,D+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*\n3)}})(i);u&&J(u,k,k+u*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;R(t,a,b,b+t*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=new THREE.Loader;THREE.JSONLoader.prototype.constructor=THREE.JSONLoader;\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn(\"THREE.JSONLoader: [\"+b+\"] seems to be unreachable or file there is empty\");a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+b+\"] [\"+f.status+\"]\");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader(\"Content-Length\"));\ne({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader(\"Content-Length\"))};f.open(\"GET\",b,true);f.overrideMimeType&&f.overrideMimeType(\"text/plain; charset=x-user-defined\");f.setRequestHeader(\"Content-Type\",\"text/plain\");f.send(null)};\nTHREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);(function(b){var c,e,j,l,k,p,m,o,q,n,r,u,t,y,s=a.faces;p=a.vertices;var w=a.normals,H=a.colors,E=0;for(c=0;c<a.uvs.length;c++)a.uvs[c].length&&E++;for(c=0;c<E;c++){d.faceUvs[c]=[];d.faceVertexUvs[c]=[]}l=0;for(k=p.length;l<k;){m=new THREE.Vector3;m.x=p[l++]*b;m.y=p[l++]*b;m.z=p[l++]*b;d.vertices.push(m)}l=0;for(k=s.length;l<k;){b=s[l++];p=b&1;j=b&2;c=b&\n4;e=b&8;o=b&16;m=b&32;n=b&64;b=b&128;if(p){r=new THREE.Face4;r.a=s[l++];r.b=s[l++];r.c=s[l++];r.d=s[l++];p=4}else{r=new THREE.Face3;r.a=s[l++];r.b=s[l++];r.c=s[l++];p=3}if(j){j=s[l++];r.materialIndex=j}j=d.faces.length;if(c)for(c=0;c<E;c++){u=a.uvs[c];q=s[l++];y=u[q*2];q=u[q*2+1];d.faceUvs[c][j]=new THREE.UV(y,q)}if(e)for(c=0;c<E;c++){u=a.uvs[c];t=[];for(e=0;e<p;e++){q=s[l++];y=u[q*2];q=u[q*2+1];t[e]=new THREE.UV(y,q)}d.faceVertexUvs[c][j]=t}if(o){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];\ne.z=w[o];r.normal=e}if(m)for(c=0;c<p;c++){o=s[l++]*3;e=new THREE.Vector3;e.x=w[o++];e.y=w[o++];e.z=w[o];r.vertexNormals.push(e)}if(n){m=s[l++];m=new THREE.Color(H[m]);r.color=m}if(b)for(c=0;c<p;c++){m=s[l++];m=new THREE.Color(H[m]);r.vertexColors.push(m)}d.faces.push(r)}})(e);(function(){var b,c,e,j;if(a.skinWeights){b=0;for(c=a.skinWeights.length;b<c;b=b+2){e=a.skinWeights[b];j=a.skinWeights[b+1];d.skinWeights.push(new THREE.Vector4(e,j,0,0))}}if(a.skinIndices){b=0;for(c=a.skinIndices.length;b<c;b=\nb+2){e=a.skinIndices[b];j=a.skinIndices[b+1];d.skinIndices.push(new THREE.Vector4(e,j,0,0))}}d.bones=a.bones;d.animation=a.animation})();(function(b){if(a.morphTargets!==void 0){var c,e,j,l,k,p;c=0;for(e=a.morphTargets.length;c<e;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];k=d.morphTargets[c].vertices;p=a.morphTargets[c].vertices;j=0;for(l=p.length;j<l;j=j+3){var m=new THREE.Vector3;m.x=p[j]*b;m.y=p[j+1]*b;m.z=p[j+2]*b;k.push(m)}}}if(a.morphColors!==\nvoid 0){c=0;for(e=a.morphColors.length;c<e;c++){d.morphColors[c]={};d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];l=d.morphColors[c].colors;k=a.morphColors[c].colors;b=0;for(j=k.length;b<j;b=b+3){p=new THREE.Color(16755200);p.setRGB(k[b],k[b+1],k[b+2]);l.push(p)}}}})(e);d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};\nTHREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;\nTHREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200||d.status==0){var e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error(\"THREE.SceneLoader: Couldn't load [\"+a+\"] [\"+d.status+\"]\")};d.open(\"GET\",a,true);d.overrideMimeType&&d.overrideMimeType(\"text/plain; charset=x-user-defined\");d.setRequestHeader(\"Content-Type\",\"text/plain\");d.send(null)};\nTHREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b==\"relativeToHTML\"?a:l+\"/\"+a}function e(){var a;for(m in D.objects)if(!C.objects[m]){u=D.objects[m];if(u.geometry!==void 0){if(J=C.geometries[u.geometry]){a=false;K=C.materials[u.materials[0]];(a=K instanceof THREE.ShaderMaterial)&&J.computeTangents();w=u.position;H=u.rotation;E=u.quaternion;z=u.scale;t=u.matrix;E=0;u.materials.length==0&&(K=new THREE.MeshFaceMaterial);u.materials.length>1&&(K=new THREE.MeshFaceMaterial);\na=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion;\nz=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T-\nG,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1],\ny[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type==\"perspective\"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==\"ortho\"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]=\nR}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type==\"directional\"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type==\"point\"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type==\"ambient\"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type==\"linear\"?P=new THREE.Fog(0,o.near,\no.far):o.type==\"exp2\"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type==\"bin_mesh\"||n.type==\"ascii_mesh\"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n=\nD.geometries[k];if(n.type==\"cube\"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type==\"plane\"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"sphere\"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type==\"cylinder\"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,\nn.heightSegs);C.geometries[k]=J}else if(n.type==\"torus\"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type==\"icosahedron\"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type==\"bin_mesh\")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"ascii_mesh\")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type==\"embedded_mesh\"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),\"\")}}for(r in D.textures){k=D.textures[r];\nif(k.url instanceof Array){i=i+k.url.length;for(n=0;n<k.url.length;n++)j.onLoadStart()}else{i=i+1;j.onLoadStart()}}U=i;for(r in D.textures){k=D.textures[r];if(k.mapping!=void 0&&THREE[k.mapping]!=void 0)k.mapping=new THREE[k.mapping];if(k.url instanceof Array){n=[];for(P=0;P<k.url.length;P++)n[P]=d(k.url[P],D.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,k.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(k.url,D.urlBaseType),k.mapping,a);if(THREE[k.minFilter]!=void 0)n.minFilter=THREE[k.minFilter];\nif(THREE[k.magFilter]!=void 0)n.magFilter=THREE[k.magFilter];if(k.repeat){n.repeat.set(k.repeat[0],k.repeat[1]);if(k.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(k.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}k.offset&&n.offset.set(k.offset[0],k.offset[1]);if(k.wrap){P={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(P[k.wrap[0]]!==void 0)n.wrapS=P[k.wrap[0]];if(P[k.wrap[1]]!==void 0)n.wrapT=P[k.wrap[1]]}}C.textures[r]=n}for(p in D.materials){t=D.materials[p];for(A in t.parameters)if(A==\n\"envMap\"||A==\"map\"||A==\"lightMap\")t.parameters[A]=C.textures[t.parameters[A]];else if(A==\"shading\")t.parameters[A]=t.parameters[A]==\"flat\"?THREE.FlatShading:THREE.SmoothShading;else if(A==\"blending\")t.parameters[A]=THREE[t.parameters[A]]?THREE[t.parameters[A]]:THREE.NormalBlending;else if(A==\"combine\")t.parameters[A]=t.parameters[A]==\"MixOperation\"?THREE.MixOperation:THREE.MultiplyOperation;else if(A==\"vertexColors\")if(t.parameters[A]==\"face\")t.parameters[A]=THREE.FaceColors;else if(t.parameters[A])t.parameters[A]=\nTHREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){r=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(r.uniforms);k=t.parameters.color;n=t.parameters.specular;P=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=C.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=\ntrue}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=C.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(k);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(P);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;K=new THREE.ShaderMaterial({fragmentShader:r.fragmentShader,vertexShader:r.vertexShader,uniforms:a,lights:true,fog:true})}else K=\nnew THREE[t.type](t.parameters);C.materials[p]=K}e();j.callbackSync(C);h()};\nTHREE.Material=function(a){a=a||{};this.id=THREE.MaterialCount++;this.name=\"\";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?\na.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;\nTHREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.AdditiveAlphaBlending=5;THREE.CustomBlending=6;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;\nTHREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;\nTHREE.LineBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.linewidth=a.linewidth!==void 0?a.linewidth:1;this.linecap=a.linecap!==void 0?a.linecap:\"round\";this.linejoin=a.linejoin!==void 0?a.linejoin:\"round\";this.vertexColors=a.vertexColors?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.LineBasicMaterial.prototype=new THREE.Material;THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:\ntrue;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==\nvoid 0?a.morphTargets:false};THREE.MeshBasicMaterial.prototype=new THREE.Material;THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=\na.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?\na.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshLambertMaterial.prototype=new THREE.Material;THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.ambient=a.ambient!==void 0?new THREE.Color(a.ambient):new THREE.Color(16777215);this.emissive=a.emissive!==void 0?new THREE.Color(a.emissive):new THREE.Color(0);this.specular=a.specular!==void 0?new THREE.Color(a.specular):new THREE.Color(1118481);this.shininess=a.shininess!==void 0?a.shininess:30;this.metal=a.metal!==void 0?a.metal:false;this.perPixel=\na.perPixel!==void 0?a.perPixel:false;this.wrapAround=a.wrapAround!==void 0?a.wrapAround:false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=a.map!==void 0?a.map:null;this.lightMap=a.lightMap!==void 0?a.lightMap:null;this.envMap=a.envMap!==void 0?a.envMap:null;this.combine=a.combine!==void 0?a.combine:THREE.MultiplyOperation;this.reflectivity=a.reflectivity!==void 0?a.reflectivity:1;this.refractionRatio=a.refractionRatio!==void 0?a.refractionRatio:0.98;this.fog=a.fog!==void 0?a.fog:true;this.shading=\na.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.wireframeLinecap=a.wireframeLinecap!==void 0?a.wireframeLinecap:\"round\";this.wireframeLinejoin=a.wireframeLinejoin!==void 0?a.wireframeLinejoin:\"round\";this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?\na.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.MeshPhongMaterial.prototype=new THREE.Material;THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;THREE.MeshDepthMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1};\nTHREE.MeshDepthMaterial.prototype=new THREE.Material;THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.shading=a.shading?a.shading:THREE.FlatShading;this.wireframe=a.wireframe?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth?a.wireframeLinewidth:1};THREE.MeshNormalMaterial.prototype=new THREE.Material;THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;\nTHREE.MeshFaceMaterial=function(){};THREE.ParticleBasicMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:null;this.size=a.size!==void 0?a.size:1;this.sizeAttenuation=a.sizeAttenuation!==void 0?a.sizeAttenuation:true;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:false;this.fog=a.fog!==void 0?a.fog:true};THREE.ParticleBasicMaterial.prototype=new THREE.Material;\nTHREE.ParticleBasicMaterial.prototype.constructor=THREE.ParticleBasicMaterial;THREE.ParticleCanvasMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.program=a.program!==void 0?a.program:function(){}};THREE.ParticleCanvasMaterial.prototype=new THREE.Material;THREE.ParticleCanvasMaterial.prototype.constructor=THREE.ParticleCanvasMaterial;\nTHREE.ParticleDOMMaterial=function(a){THREE.Material.call(this);this.domElement=a};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this,a);a=a||{};this.fragmentShader=a.fragmentShader!==void 0?a.fragmentShader:\"void main() {}\";this.vertexShader=a.vertexShader!==void 0?a.vertexShader:\"void main() {}\";this.uniforms=a.uniforms!==void 0?a.uniforms:{};this.attributes=a.attributes;this.shading=a.shading!==void 0?a.shading:THREE.SmoothShading;this.wireframe=a.wireframe!==void 0?a.wireframe:false;this.wireframeLinewidth=a.wireframeLinewidth!==void 0?a.wireframeLinewidth:1;this.fog=\na.fog!==void 0?a.fog:false;this.lights=a.lights!==void 0?a.lights:false;this.vertexColors=a.vertexColors!==void 0?a.vertexColors:THREE.NoColors;this.skinning=a.skinning!==void 0?a.skinning:false;this.morphTargets=a.morphTargets!==void 0?a.morphTargets:false;this.morphNormals=a.morphNormals!==void 0?a.morphNormals:false};THREE.ShaderMaterial.prototype=new THREE.Material;THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h){this.id=THREE.TextureCount++;this.image=a;this.mapping=b!==void 0?b:new THREE.UVMapping;this.wrapS=c!==void 0?c:THREE.ClampToEdgeWrapping;this.wrapT=d!==void 0?d:THREE.ClampToEdgeWrapping;this.magFilter=e!==void 0?e:THREE.LinearFilter;this.minFilter=f!==void 0?f:THREE.LinearMipMapLinearFilter;this.format=g!==void 0?g:THREE.RGBAFormat;this.type=h!==void 0?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=\ntrue;this.needsUpdate=this.premultiplyAlpha=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(){var a=new THREE.Texture(this.image,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter,this.format,this.type);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a}};THREE.TextureCount=0;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};\nTHREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=0;THREE.ClampToEdgeWrapping=1;THREE.MirroredRepeatWrapping=2;THREE.NearestFilter=3;THREE.NearestMipMapNearestFilter=4;THREE.NearestMipMapLinearFilter=5;THREE.LinearFilter=6;THREE.LinearMipMapNearestFilter=7;THREE.LinearMipMapLinearFilter=8;THREE.ByteType=9;THREE.UnsignedByteType=10;THREE.ShortType=11;THREE.UnsignedShortType=12;THREE.IntType=13;THREE.UnsignedIntType=14;THREE.FloatType=15;\nTHREE.AlphaFormat=16;THREE.RGBFormat=17;THREE.RGBAFormat=18;THREE.LuminanceFormat=19;THREE.LuminanceAlphaFormat=20;THREE.DataTexture=function(a,b,c,d,e,f,g,h,j,l){THREE.Texture.call(this,null,f,g,h,j,l,d,e);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=new THREE.Texture;THREE.DataTexture.prototype.constructor=THREE.DataTexture;\nTHREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture(this.image.data,this.image.width,this.image.height,this.format,this.type,this.mapping,this.wrapS,this.wrapT,this.magFilter,this.minFilter);a.offset.copy(this.offset);a.repeat.copy(this.repeat);return a};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a};THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;\nTHREE.ParticleSystem=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius}this.frustumCulled=false};THREE.ParticleSystem.prototype=new THREE.Object3D;THREE.ParticleSystem.prototype.constructor=THREE.ParticleSystem;\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=c!==void 0?c:THREE.LineStrip;this.geometry&&(this.geometry.boundingSphere||this.geometry.computeBoundingSphere())};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line;\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b!==void 0?b:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry){this.geometry.boundingSphere||this.geometry.computeBoundingSphere();this.boundRadius=a.boundingSphere.radius;if(this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var c=0;c<this.geometry.morphTargets.length;c++){this.morphTargetInfluences.push(0);\nthis.morphTargetDictionary[this.geometry.morphTargets[c].name]=c}}}};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.supr=THREE.Object3D.prototype;THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(this.morphTargetDictionary[a]!==void 0)return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=new THREE.Object3D;THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.supr=THREE.Object3D.prototype;\nTHREE.Bone.prototype.update=function(a,b){this.matrixAutoUpdate&&(b=b|this.updateMatrix());if(b||this.matrixWorldNeedsUpdate){a?this.skinMatrix.multiply(a,this.matrix):this.skinMatrix.copy(this.matrix);this.matrixWorldNeedsUpdate=false;b=true}var c,d=this.children.length;for(c=0;c<d;c++)this.children[c].update(this.skinMatrix,b)};\nTHREE.SkinnedMesh=function(a,b){THREE.Mesh.call(this,a,b);this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var c,d,e,f,g,h;if(this.geometry.bones!==void 0){for(c=0;c<this.geometry.bones.length;c++){e=this.geometry.bones[c];f=e.pos;g=e.rotq;h=e.scl;d=this.addBone();d.name=e.name;d.position.set(f[0],f[1],f[2]);d.quaternion.set(g[0],g[1],g[2],g[3]);d.useQuaternion=true;h!==void 0?d.scale.set(h[0],h[1],h[2]):d.scale.set(1,1,1)}for(c=0;c<this.bones.length;c++){e=this.geometry.bones[c];\nd=this.bones[c];e.parent===-1?this.add(d):this.bones[e.parent].add(d)}this.boneMatrices=new Float32Array(16*this.bones.length);this.pose()}};THREE.SkinnedMesh.prototype=new THREE.Mesh;THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;THREE.SkinnedMesh.prototype.addBone=function(a){a===void 0&&(a=new THREE.Bone(this));this.bones.push(a);return a};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false}for(var a=0,b=this.children.length;a<b;a++){var c=this.children[a];c instanceof THREE.Bone?c.update(this.identityMatrix,false):c.updateMatrixWorld(true)}for(var b=this.bones.length,c=this.bones,d=this.boneMatrices,a=0;a<b;a++)c[a].skinMatrix.flattenToArrayOffset(d,\na*16)};\nTHREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var a,b=[],c=0;c<this.bones.length;c++){a=this.bones[c];var d=new THREE.Matrix4;d.getInverse(a.skinMatrix);b.push(d);a.skinMatrix.flattenToArrayOffset(this.boneMatrices,c*16)}if(this.geometry.skinVerticesA===void 0){this.geometry.skinVerticesA=[];this.geometry.skinVerticesB=[];for(a=0;a<this.geometry.skinIndices.length;a++){var c=this.geometry.vertices[a],e=this.geometry.skinIndices[a].x,f=this.geometry.skinIndices[a].y,d=\nnew THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));d=new THREE.Vector3(c.x,c.y,c.z);this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));if(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y!==1){c=(1-(this.geometry.skinWeights[a].x+this.geometry.skinWeights[a].y))*0.5;this.geometry.skinWeights[a].x=this.geometry.skinWeights[a].x+c;this.geometry.skinWeights[a].y=this.geometry.skinWeights[a].y+c}}}};\nTHREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=false;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=new THREE.Mesh;THREE.MorphAnimMesh.prototype.constructor=THREE.MorphAnimMesh;\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;if(!a.animations)a.animations={};for(var b,c=a.animations,d=/([a-z]+)(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&g.length>1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(e<h.start)h.start=e;if(e>h.end)h.end=e;b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/\nb),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};\nTHREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c<this.LODs.length;c++)if(b<this.LODs[c].visibleAtDistance)break;this.LODs.splice(c,0,{visibleAtDistance:b,object3D:a});this.add(a)};\nTHREE.LOD.prototype.update=function(a){if(this.LODs.length>1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b<this.LODs.length;b++)if(a>=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b<this.LODs.length;b++)this.LODs[b].object3D.visible=\nfalse}};\nTHREE.Sprite=function(a){THREE.Object3D.call(this);this.color=a.color!==void 0?new THREE.Color(a.color):new THREE.Color(16777215);this.map=a.map!==void 0?a.map:new THREE.Texture;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.useScreenCoordinates=a.useScreenCoordinates!==void 0?\na.useScreenCoordinates:true;this.mergeWith3D=a.mergeWith3D!==void 0?a.mergeWith3D:!this.useScreenCoordinates;this.affectedByDistance=a.affectedByDistance!==void 0?a.affectedByDistance:!this.useScreenCoordinates;this.scaleByViewport=a.scaleByViewport!==void 0?a.scaleByViewport:!this.affectedByDistance;this.alignment=a.alignment instanceof THREE.Vector2?a.alignment:THREE.SpriteAlignment.center;this.rotation3d=this.rotation;this.rotation=0;this.opacity=1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=\nnew THREE.Vector2(1,1)};THREE.Sprite.prototype=new THREE.Object3D;THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale);this.boundRadiusScale=Math.max(this.scale.x,this.scale.y)}this.matrixWorldNeedsUpdate=true};THREE.SpriteAlignment={};\nTHREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);\nTHREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=new THREE.Object3D;THREE.Scene.prototype.constructor=THREE.Scene;\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};\nTHREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};\nTHREE.DOMRenderer=function(){console.log(\"THREE.DOMRenderer\",THREE.REVISION);var a,b,c,d,e,f,g,h=new THREE.Projector;g=function(a){for(var b=document.documentElement,c=0;c<a.length;c++)if(typeof b.style[a[c]]===\"string\")return a[c];return null}([\"transform\",\"MozTransform\",\"WebkitTransform\",\"msTransform\",\"OTransform\"]);this.domElement=document.createElement(\"div\");this.setSize=function(a,b){c=a;d=b;e=c/2;f=d/2};this.render=function(c,d){var k,p,m,o,q,n;a=h.projectScene(c,d);b=a.elements;k=0;for(p=\nb.length;k<p;k++){m=b[k];if(m instanceof THREE.RenderableParticle&&m.material instanceof THREE.ParticleDOMMaterial){o=m.material.domElement;q=m.x*e+e-(o.offsetWidth>>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+\"px\";o.style.top=n+\"px\";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]=\"scale(\"+m.scale.x*e+\",\"+m.scale.y*f+\")\")}}}};\nTHREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation=\"source-over\";break;case THREE.AdditiveBlending:n.globalCompositeOperation=\"lighter\"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),p,m,o,q,n=k.getContext(\"2d\"),\nr=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement(\"canvas\");\nib.width=ib.height=2;Db=ib.getContext(\"2d\");Db.fillStyle=\"rgba(0,0,0,1)\";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement(\"canvas\");pc.width=pc.height=a;Bc=pc.getContext(\"2d\");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y=\n0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e(\"rgba(\"+Math.floor(r.r*255)+\",\"+Math.floor(r.g*255)+\",\"+Math.floor(r.b*\n255)+\",\"+u+\")\");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){aa.r=aa.r+e.r;aa.g=aa.g+e.g;aa.b=aa.b+e.b}else if(d instanceof THREE.DirectionalLight){Ta.r=Ta.r+e.r;Ta.g=Ta.g+e.g;Ta.b=Ta.b+e.b}else if(d instanceof THREE.PointLight){Qa.r=Qa.r+e.r;\nQa.g=Qa.g+e.g;Qa.b=Qa.b+e.b}}}function p(a,b,c,d){var e,f,g,i,h,j;e=0;for(f=a.length;e<f;e++){g=a[e];i=g.color;if(g instanceof THREE.DirectionalLight){h=g.matrixWorld.getPosition();j=c.dot(h);if(!(j<=0)){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+i.b*j}}else if(g instanceof THREE.PointLight){h=g.matrixWorld.getPosition();j=c.dot(oa.sub(h,b).normalize());if(!(j<=0)){j=j*(g.distance==0?1:1-Math.min(b.distanceTo(h)/g.distance,1));if(j!=0){j=j*g.intensity;d.r=d.r+i.r*j;d.g=d.g+i.g*j;d.b=d.b+\ni.b*j}}}}}function r(a,f,g){b(g.opacity);c(g.blending);var i,h,j,k,l,m;if(g instanceof THREE.ParticleBasicMaterial){if(g.map){k=g.map.image;l=k.width>>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle());\ne(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth*\n2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=\nk.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y*\na.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2],\n$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g=\naa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,\nRa,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a,\nd,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&&\nm.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g=\nMath.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld,\nn.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C,\nY);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,\nd);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT==\nTHREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?\"repeat\":o&&!q?\"repeat-x\":!o&&q?\"repeat-y\":\"no-repeat\");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement(\"canvas\");b.width=p.image.width;b.height=p.image.height;b=b.getContext(\"2d\");b.drawImage(p.image,\n0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)*\no;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0:\nj>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces=\n0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc<bd;Dc++){Ha=h[Dc];eb=Ha.material;eb=eb instanceof THREE.MeshFaceMaterial?Ha.faceMaterial:eb;if(!(eb===void 0||eb.visible===false)){xa.empty();if(Ha instanceof THREE.RenderableParticle){v=Ha;v.x=v.x*o;v.y=v.y*q;r(v,Ha,eb,a)}else if(Ha instanceof THREE.RenderableLine){v=Ha.v1;A=Ha.v2;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*\no;A.positionScreen.y=A.positionScreen.y*q;xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,A.positionScreen.y);Wa.intersects(xa)&&s(v,A,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace3){v=Ha.v1;A=Ha.v2;J=Ha.v3;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;J.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;if(eb.overdraw){Nb(v.positionScreen,\nA.positionScreen);Nb(A.positionScreen,J.positionScreen);Nb(J.positionScreen,v.positionScreen)}xa.add3Points(v.positionScreen.x,v.positionScreen.y,A.positionScreen.x,A.positionScreen.y,J.positionScreen.x,J.positionScreen.y);Wa.intersects(xa)&&t(v,A,J,0,1,2,Ha,eb,a)}else if(Ha instanceof THREE.RenderableFace4){v=Ha.v1;A=Ha.v2;J=Ha.v3;K=Ha.v4;v.positionScreen.x=v.positionScreen.x*o;v.positionScreen.y=v.positionScreen.y*q;A.positionScreen.x=A.positionScreen.x*o;A.positionScreen.y=A.positionScreen.y*q;\nJ.positionScreen.x=J.positionScreen.x*o;J.positionScreen.y=J.positionScreen.y*q;K.positionScreen.x=K.positionScreen.x*o;K.positionScreen.y=K.positionScreen.y*q;R.positionScreen.copy(A.positionScreen);P.positionScreen.copy(K.positionScreen);if(eb.overdraw){Nb(v.positionScreen,A.positionScreen);Nb(A.positionScreen,K.positionScreen);Nb(K.positionScreen,v.positionScreen);Nb(J.positionScreen,R.positionScreen);Nb(J.positionScreen,P.positionScreen)}xa.addPoint(v.positionScreen.x,v.positionScreen.y);xa.addPoint(A.positionScreen.x,\nA.positionScreen.y);xa.addPoint(J.positionScreen.x,J.positionScreen.y);xa.addPoint(K.positionScreen.x,K.positionScreen.y);Wa.intersects(xa)&&u(v,A,J,K,R,P,Ha,eb,a)}Ba.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}};\nTHREE.SVGRenderer=function(){function a(a,b,c,d){var e,f,g,h,j,k;e=0;for(f=a.length;e<f;e++){g=a[e];h=g.color;if(g instanceof THREE.DirectionalLight){j=g.matrixWorld.getPosition();k=c.dot(j);if(!(k<=0)){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*k}}else if(g instanceof THREE.PointLight){j=g.matrixWorld.getPosition();k=c.dot(v.sub(j,b).normalize());if(!(k<=0)){k=k*(g.distance==0?1:1-Math.min(b.distanceTo(j)/g.distance,1));if(k!=0){k=k*g.intensity;d.r=d.r+h.r*k;d.g=d.g+h.g*k;d.b=d.b+h.b*\nk}}}}}function b(a){if(A[a]==null){A[a]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");D==0&&A[a].setAttribute(\"shape-rendering\",\"crispEdges\")}return A[a]}function c(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}console.log(\"THREE.SVGRenderer\",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color,\nz,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case \"high\":D=1;break;case \"low\":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute(\"viewBox\",-p+\" \"+-m+\" \"+l+\" \"+k);j.setAttribute(\"width\",l);j.setAttribute(\"height\",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k,\nl){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i<v;i++){C=g[i];A=C.color;if(C instanceof THREE.AmbientLight){w.r=w.r+A.r;w.g=w.g+A.g;w.b=w.b+A.b}else if(C instanceof THREE.DirectionalLight){H.r=H.r+A.r;H.g=H.g+A.g;H.b=H.b+A.b}else if(C instanceof THREE.PointLight){E.r=E.r+A.r;E.g=E.g+A.g;E.b=E.b+A.b}}}i=\n0;for(v=f.length;i<v;i++){A=f[i];C=A.material;C=C instanceof THREE.MeshFaceMaterial?A.faceMaterial:C;if(!(C===void 0||C.visible===false)){t.empty();if(A instanceof THREE.RenderableParticle){o=A;o.x=o.x*p;o.y=o.y*-m}else if(A instanceof THREE.RenderableLine){o=A.v1;q=A.v2;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);if(u.intersects(t)){A=o;var Y=q,F=P++;if(J[F]==null){J[F]=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");D==0&&J[F].setAttribute(\"shape-rendering\",\"crispEdges\")}K=J[F];K.setAttribute(\"x1\",A.positionScreen.x);K.setAttribute(\"y1\",A.positionScreen.y);K.setAttribute(\"x2\",Y.positionScreen.x);K.setAttribute(\"y2\",Y.positionScreen.y);if(C instanceof THREE.LineBasicMaterial){K.setAttribute(\"style\",\"fill: none; stroke: \"+C.color.getContextStyle()+\"; stroke-width: \"+C.linewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.linecap+\"; stroke-linejoin: \"+C.linejoin);j.appendChild(K)}}}else if(A instanceof THREE.RenderableFace3){o=A.v1;q=A.v2;n=A.v3;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=n.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,\nq.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n;d.info.render.vertices=d.info.render.vertices+3;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,\nA.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\n\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}else if(A instanceof THREE.RenderableFace4){o=A.v1;q=A.v2;n=A.v3;r=A.v4;o.positionScreen.x=o.positionScreen.x*p;o.positionScreen.y=o.positionScreen.y*-m;q.positionScreen.x=q.positionScreen.x*p;q.positionScreen.y=q.positionScreen.y*-m;n.positionScreen.x=n.positionScreen.x*p;n.positionScreen.y=\nn.positionScreen.y*-m;r.positionScreen.x=r.positionScreen.x*p;r.positionScreen.y=r.positionScreen.y*-m;t.addPoint(o.positionScreen.x,o.positionScreen.y);t.addPoint(q.positionScreen.x,q.positionScreen.y);t.addPoint(n.positionScreen.x,n.positionScreen.y);t.addPoint(r.positionScreen.x,r.positionScreen.y);if(u.intersects(t)){var Y=o,F=q,ea=n,fa=r;d.info.render.vertices=d.info.render.vertices+4;d.info.render.faces++;K=b(R++);K.setAttribute(\"d\",\"M \"+Y.positionScreen.x+\" \"+Y.positionScreen.y+\" L \"+F.positionScreen.x+\n\" \"+F.positionScreen.y+\" L \"+ea.positionScreen.x+\",\"+ea.positionScreen.y+\" L \"+fa.positionScreen.x+\",\"+fa.positionScreen.y+\"z\");if(C instanceof THREE.MeshBasicMaterial)s.copy(C.color);else if(C instanceof THREE.MeshLambertMaterial)if(y){s.r=w.r;s.g=w.g;s.b=w.b;a(g,A.centroidWorld,A.normalWorld,s);s.r=Math.max(0,Math.min(C.color.r*s.r,1));s.g=Math.max(0,Math.min(C.color.g*s.g,1));s.b=Math.max(0,Math.min(C.color.b*s.b,1))}else s.copy(C.color);else if(C instanceof THREE.MeshDepthMaterial){z=1-C.__2near/\n(C.__farPlusNear-A.z*C.__farMinusNear);s.setRGB(z,z,z)}else C instanceof THREE.MeshNormalMaterial&&s.setRGB(c(A.normalWorld.x),c(A.normalWorld.y),c(A.normalWorld.z));C.wireframe?K.setAttribute(\"style\",\"fill: none; stroke: \"+s.getContextStyle()+\"; stroke-width: \"+C.wireframeLinewidth+\"; stroke-opacity: \"+C.opacity+\"; stroke-linecap: \"+C.wireframeLinecap+\"; stroke-linejoin: \"+C.wireframeLinejoin):K.setAttribute(\"style\",\"fill: \"+s.getContextStyle()+\"; fill-opacity: \"+C.opacity);j.appendChild(K)}}}}}};\nTHREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",\nenvmap_pars_fragment:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );\\n} else {\\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\\n}\\n#endif\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",envmap_vertex:\"#ifdef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\\nif ( useRefract ) {\\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\\n} else {\\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\\n}\\n#endif\",\nmap_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\\n#endif\",map_pars_vertex:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#ifdef USE_MAP\\nvarying vec2 vUv;\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#ifdef USE_MAP\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( map, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\\n#endif\\n#endif\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",\nlights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nlVector = normalize( lVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",\nlights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvWorldPosition = mPosition.xyz;\\n#endif\",\nlights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",\nlights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse  = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse  = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngle[ i ] ) {\\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse  = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",\ncolor_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\\ngl_Position  = projectionMatrix * modelViewMatrix * gl_Position;\\n#endif\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\",\ndefault_vertex:\"#ifndef USE_MORPHTARGETS\\n#ifndef USE_SKINNING\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\nvec3 transformedNormal = normalMatrix * morphedNormal;\\n#else\\nvec3 transformedNormal = normalMatrix * normal;\\n#endif\",\nshadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#ifdef SHADOWMAP_SOFT\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n#ifdef USE_MORPHTARGETS\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\\n#else\\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\\n#endif\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",\nlinear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++){d=this.clone(a[b]);for(c in d)e[c]=d[c]}return e},clone:function(a){var b,c,d,e={};for(b in a){e[b]={};for(c in a[b]){d=a[b][c];e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d}}return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:2,texture:null},envMap:{type:\"t\",value:1,texture:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:0.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},fog:{fogDensity:{type:\"f\",\nvalue:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",\nvalue:[]},spotLightAngle:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:0,texture:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:6,texture:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",\nvalue:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",\nvalue:1}},vertexShader:\"varying vec3 vNormal;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvNormal = normalMatrix * normal;\\ngl_Position = projectionMatrix * mvPosition;\\n}\",fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,\nTHREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,\nTHREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,\n1,1)}}]),vertexShader:[\"varying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\",THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},\nshininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"varying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,\"#ifndef USE_ENVMAP\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\n#endif\\nvViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.morphnormal_vertex,\"vNormal = transformedNormal;\",THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",\nTHREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,\nTHREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=true;var g=1;f.type===\"v2\"?g=2:f.type===\"v3\"?g=3:f.type===\"v4\"?g=4:f.type===\"c\"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=i.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=true}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;\nvar j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){e=h[d];$a.copy(e);xa.multiplyVector3($a);n[d]=[$a.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){e=h[n[d][1]];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}for(d=0;d<k;d++){f=d*3;e=j[n[d][1]];m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];\nif(h.boundTo===void 0||h.boundTo===\"vertices\"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type===\"c\")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];\ng=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(p)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(o)for(d=0;d<k;d++){e=j[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo===\"vertices\")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===\n3)if(h.type===\"c\")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}if(p||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,l,b)}if(o||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,a.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,\nm,b)}if(q){j=0;for(k=q.length;j<k;j++){h=q[j];if(h.needsUpdate||c.sortParticles){i.bindBuffer(i.ARRAY_BUFFER,h.buffer);i.bufferData(i.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++){ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true;a[d].render(b,c,hb,Cb);ea=U=null;Y=F=O=ia=Ka=Ma=Q=-1;Ta=true}}function j(a,b,c,d,e,f,g,h){var i,j,k,l;if(b){j=a.length-1;l=b=-1}else{j=0;b=a.length;l=1}for(var m=j;m!==b;m=m+l){i=a[m];if(i.render){j=i.object;k=\ni.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&G.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);G.setDepthTest(i.depthTest);G.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}G.setObjectFaces(j);k instanceof THREE.BufferGeometry?G.renderBufferDirect(d,e,f,i,k,j):G.renderBuffer(d,e,f,i,k,j)}}}function l(a,b,c,d,e,f,g){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&G.setBlending(h.blending,\nh.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,i)}}}function k(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===\nb&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f<g;f++)e.__webglMorphTargetInfluences[f]=0}var h=false,f=d.program,g=f.uniforms,j=d.uniforms;if(f!==U){i.useProgram(f);U=f;h=true}if(d.id!==Y){Y=d.id;h=true}if(h||a!==\nea){i.uniformMatrix4fv(g.projectionMatrix,false,a._projectionMatrixArray);a!==ea&&(ea=a)}if(h){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Ta){for(var k,l=0,m=0,n=0,p,o,q,r=Qa,s=r.directional.colors,t=r.directional.positions,u=r.point.colors,v=r.point.positions,w=r.point.distances,\nz=r.spot.colors,A=r.spot.positions,C=r.spot.distances,D=r.spot.directions,F=r.spot.angles,J=r.spot.exponents,K=0,Q=0,M=0,O=q=0,c=O=0,h=b.length;c<h;c++){k=b[c];if(!k.onlyShadow){p=k.color;o=k.intensity;q=k.distance;if(k instanceof THREE.AmbientLight)if(G.gammaInput){l=l+p.r*p.r;m=m+p.g*p.g;n=n+p.b*p.b}else{l=l+p.r;m=m+p.g;n=n+p.b}else if(k instanceof THREE.DirectionalLight){q=K*3;if(G.gammaInput){s[q]=p.r*p.r*o*o;s[q+1]=p.g*p.g*o*o;s[q+2]=p.b*p.b*o*o}else{s[q]=p.r*o;s[q+1]=p.g*o;s[q+2]=p.b*o}aa.copy(k.matrixWorld.getPosition());\naa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();t[q]=aa.x;t[q+1]=aa.y;t[q+2]=aa.z;K=K+1}else if(k instanceof THREE.PointLight){O=Q*3;if(G.gammaInput){u[O]=p.r*p.r*o*o;u[O+1]=p.g*p.g*o*o;u[O+2]=p.b*p.b*o*o}else{u[O]=p.r*o;u[O+1]=p.g*o;u[O+2]=p.b*o}p=k.matrixWorld.getPosition();v[O]=p.x;v[O+1]=p.y;v[O+2]=p.z;w[Q]=q;Q=Q+1}else if(k instanceof THREE.SpotLight){O=M*3;if(G.gammaInput){z[O]=p.r*p.r*o*o;z[O+1]=p.g*p.g*o*o;z[O+2]=p.b*p.b*o*o}else{z[O]=p.r*o;z[O+1]=p.g*o;z[O+2]=p.b*o}p=k.matrixWorld.getPosition();\nA[O]=p.x;A[O+1]=p.y;A[O+2]=p.z;C[M]=q;aa.copy(p);aa.subSelf(k.target.matrixWorld.getPosition());aa.normalize();D[O]=aa.x;D[O+1]=aa.y;D[O+2]=aa.z;F[M]=Math.cos(k.angle);J[M]=k.exponent;M=M+1}}}c=K*3;for(h=s.length;c<h;c++)s[c]=0;c=Q*3;for(h=u.length;c<h;c++)u[c]=0;c=M*3;for(h=z.length;c<h;c++)z[c]=0;r.directional.length=K;r.point.length=Q;r.spot.length=M;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;Ta=false}c=Qa;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;\nj.directionalLightDirection.value=c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||\nd instanceof THREE.MeshPhongMaterial){j.opacity.value=d.opacity;G.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=\nd.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=E.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);\nj.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive;j.specular.value=d.specular}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(G.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive)}else{j.ambient.value=d.ambient;j.emissive.value=d.emissive}d.wrapAround&&j.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){j.mNear.value=\na.near;j.mFar.value=a.far;j.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)j.opacity.value=d.opacity;if(e.receiveShadow&&!d._shadowPass&&j.shadowMatrix){h=c=0;for(k=b.length;h<k;h++){l=b[h];if(l.castShadow&&(l instanceof THREE.SpotLight||l instanceof THREE.DirectionalLight&&!l.shadowCascade)){j.shadowMap.texture[c]=l.shadowMap;j.shadowMapSize.value[c]=l.shadowMapSize;j.shadowMatrix.value[c]=l.shadowMatrix;j.shadowDarkness.value[c]=l.shadowDarkness;j.shadowBias.value[c]=l.shadowBias;\nc++}}}b=d.uniformsList;j=0;for(c=b.length;j<c;j++)if(l=f.uniforms[b[j][1]]){h=b[j][0];m=h.type;k=h.value;switch(m){case \"i\":i.uniform1i(l,k);break;case \"f\":i.uniform1f(l,k);break;case \"v2\":i.uniform2f(l,k.x,k.y);break;case \"v3\":i.uniform3f(l,k.x,k.y,k.z);break;case \"v4\":i.uniform4f(l,k.x,k.y,k.z,k.w);break;case \"c\":i.uniform3f(l,k.r,k.g,k.b);break;case \"fv1\":i.uniform1fv(l,k);break;case \"fv\":i.uniform3fv(l,k);break;case \"v2v\":if(!h._array)h._array=new Float32Array(2*k.length);m=0;for(n=k.length;m<\nn;m++){r=m*2;h._array[r]=k[m].x;h._array[r+1]=k[m].y}i.uniform2fv(l,h._array);break;case \"v3v\":if(!h._array)h._array=new Float32Array(3*k.length);m=0;for(n=k.length;m<n;m++){r=m*3;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z}i.uniform3fv(l,h._array);break;case \"v4v\":if(!h._array)h._array=new Float32Array(4*k.length);m=0;for(n=k.length;m<n;m++){r=m*4;h._array[r]=k[m].x;h._array[r+1]=k[m].y;h._array[r+2]=k[m].z;h._array[r+3]=k[m].w}i.uniform4fv(l,h._array);break;case \"m4\":if(!h._array)h._array=\nnew Float32Array(16);k.flattenToArray(h._array);i.uniformMatrix4fv(l,false,h._array);break;case \"m4v\":if(!h._array)h._array=new Float32Array(16*k.length);m=0;for(n=k.length;m<n;m++)k[m].flattenToArrayOffset(h._array,m*16);i.uniformMatrix4fv(l,false,h._array);break;case \"t\":i.uniform1i(l,k);l=h.texture;if(!l)continue;if(l.image instanceof Array&&l.image.length===6){h=l;if(h.image.length===6)if(h.needsUpdate){if(!h.image.__webglTextureCube)h.image.__webglTextureCube=i.createTexture();i.activeTexture(i.TEXTURE0+\nk);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube);k=[];for(l=0;l<6;l++){m=k;n=l;if(G.autoScaleCubemaps){r=h.image[l];t=ib;if(!(r.width<=t&&r.height<=t)){u=Math.max(r.width,r.height);s=Math.floor(r.width*t/u);t=Math.floor(r.height*t/u);u=document.createElement(\"canvas\");u.width=s;u.height=t;u.getContext(\"2d\").drawImage(r,0,0,r.width,r.height,0,0,s,t);r=u}}else r=h.image[l];m[n]=r}l=k[0];m=(l.width&l.width-1)===0&&(l.height&l.height-1)===0;n=H(h.format);r=H(h.type);y(i.TEXTURE_CUBE_MAP,\nh,m);for(l=0;l<6;l++)i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,n,n,r,k[l]);h.generateMipmaps&&m&&i.generateMipmap(i.TEXTURE_CUBE_MAP);h.needsUpdate=false;if(h.onUpdate)h.onUpdate()}else{i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.image.__webglTextureCube)}}else if(l instanceof THREE.WebGLRenderTargetCube){h=l;i.activeTexture(i.TEXTURE0+k);i.bindTexture(i.TEXTURE_CUBE_MAP,h.__webglTexture)}else G.setTexture(l,k);break;case \"tv\":if(!h._array){h._array=[];m=0;for(n=h.texture.length;m<\nn;m++)h._array[m]=k+m}i.uniform1iv(l,h._array);m=0;for(n=h.texture.length;m<n;m++)(l=h.texture[m])&&G.setTexture(l,h._array[m])}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&g.cameraPosition!==null){b=a.matrixWorld.getPosition();i.uniform3f(g.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&g.viewMatrix!==null&&i.uniformMatrix4fv(g.viewMatrix,false,a._viewMatrixArray);\nd.skinning&&i.uniformMatrix4fv(g.boneGlobalMatrices,false,e.boneMatrices)}i.uniformMatrix4fv(g.modelViewMatrix,false,e._modelViewMatrix.elements);g.normalMatrix&&i.uniformMatrix3fv(g.normalMatrix,false,e._normalMatrix.elements);g.objectMatrix!==null&&i.uniformMatrix4fv(g.objectMatrix,false,e.matrixWorld.elements);return f}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ra!==\na){a?i.enable(i.POLYGON_OFFSET_FILL):i.disable(i.POLYGON_OFFSET_FILL);Ra=a}if(a&&(La!==b||Sa!==c)){i.polygonOffset(b,c);La=b;Sa=c}}function t(a,b){var c;a===\"fragment\"?c=i.createShader(i.FRAGMENT_SHADER):a===\"vertex\"&&(c=i.createShader(i.VERTEX_SHADER));i.shaderSource(c,b);i.compileShader(c);if(!i.getShaderParameter(c,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(c));console.error(b);return null}return c}function y(a,b,c){if(c){i.texParameteri(a,i.TEXTURE_WRAP_S,H(b.wrapS));i.texParameteri(a,\ni.TEXTURE_WRAP_T,H(b.wrapT));i.texParameteri(a,i.TEXTURE_MAG_FILTER,H(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,H(b.minFilter))}else{i.texParameteri(a,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);i.texParameteri(a,i.TEXTURE_MAG_FILTER,w(b.magFilter));i.texParameteri(a,i.TEXTURE_MIN_FILTER,w(b.minFilter))}}function s(a,b){i.bindRenderbuffer(i.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,\nb.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,b.width,b.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,a)}else i.renderbufferStorage(i.RENDERBUFFER,i.RGBA4,b.width,b.height)}function w(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return i.NEAREST;default:return i.LINEAR}}\nfunction H(a){switch(a){case THREE.RepeatWrapping:return i.REPEAT;case THREE.ClampToEdgeWrapping:return i.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return i.MIRRORED_REPEAT;case THREE.NearestFilter:return i.NEAREST;case THREE.NearestMipMapNearestFilter:return i.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return i.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return i.LINEAR;case THREE.LinearMipMapNearestFilter:return i.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return i.LINEAR_MIPMAP_LINEAR;\ncase THREE.ByteType:return i.BYTE;case THREE.UnsignedByteType:return i.UNSIGNED_BYTE;case THREE.ShortType:return i.SHORT;case THREE.UnsignedShortType:return i.UNSIGNED_SHORT;case THREE.IntType:return i.INT;case THREE.UnsignedIntType:return i.UNSIGNED_INT;case THREE.FloatType:return i.FLOAT;case THREE.AlphaFormat:return i.ALPHA;case THREE.RGBFormat:return i.RGB;case THREE.RGBAFormat:return i.RGBA;case THREE.LuminanceFormat:return i.LUMINANCE;case THREE.LuminanceAlphaFormat:return i.LUMINANCE_ALPHA;\ncase THREE.AddEquation:return i.FUNC_ADD;case THREE.SubtractEquation:return i.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return i.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return i.ZERO;case THREE.OneFactor:return i.ONE;case THREE.SrcColorFactor:return i.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return i.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return i.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return i.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return i.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return i.ONE_MINUS_DST_ALPHA;\ncase THREE.DstColorFactor:return i.DST_COLOR;case THREE.OneMinusDstColorFactor:return i.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return i.SRC_ALPHA_SATURATE}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var a=a||{},E=a.canvas!==void 0?a.canvas:document.createElement(\"canvas\"),z=a.precision!==void 0?a.precision:\"highp\",v=a.alpha!==void 0?a.alpha:true,A=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:\ntrue,R=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,P=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),D=a.clearAlpha!==void 0?a.clearAlpha:0,M=a.maxLights!==void 0?a.maxLights:4;this.domElement=E;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=\nthis.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,i,T=[],U=null,C=null,Y=-1,F=null,ea=null,fa=0,ia=-1,O=-1,Q=-1,Z=-1,$=-1,ha=-1,Ma=-1,Ka=-1,Ra=null,La=null,Sa=null,Na=null,Kb=0,lb=0,gb=0,Lb=0,hb=0,Cb=0,Wa=new THREE.Frustum,\nBa=new THREE.Matrix4,xa=new THREE.Matrix4,$a=new THREE.Vector4,aa=new THREE.Vector3,Ta=true,Qa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}};i=function(){var a;try{if(!(a=E.getContext(\"experimental-webgl\",{alpha:v,premultipliedAlpha:A,antialias:J,stencil:K,preserveDrawingBuffer:R})))throw\"Error creating WebGL context.\";}catch(b){console.error(b)}a.getExtension(\"OES_texture_float\")||\nconsole.log(\"THREE.WebGLRenderer: Float textures not supported.\");return a}();i.clearColor(0,0,0,1);i.clearDepth(1);i.clearStencil(0);i.enable(i.DEPTH_TEST);i.depthFunc(i.LEQUAL);i.frontFace(i.CCW);i.cullFace(i.BACK);i.enable(i.CULL_FACE);i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA);i.clearColor(P.r,P.g,P.b,D);this.context=i;var oa=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS);i.getParameter(i.MAX_TEXTURE_SIZE);var ib=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE);\nthis.getContext=function(){return i};this.supportsVertexTextures=function(){return oa>0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a,\nb){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};\nthis.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer);\ni.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)i.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)i.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=\nvoid 0;for(d in c.__webglCustomAttributesList)i.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}G.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);i.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;i.deleteBuffer(a.__webglVertexBuffer);\ni.deleteBuffer(a.__webglColorBuffer);G.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;i.deleteTexture(a.__webglTexture);G.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){i.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){i.deleteFramebuffer(a.__webglFramebuffer[b]);i.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{i.deleteFramebuffer(a.__webglFramebuffer);\ni.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.updateShadowMap=function(a,b){U=null;Y=F=Ka=Ma=Q=-1;Ta=true;O=ia=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=i.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=i.createBuffer();if(a.hasPos){i.bindBuffer(i.ARRAY_BUFFER,a.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,a.positionArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.position);i.vertexAttribPointer(b.attributes.position,\n3,i.FLOAT,false,0,0)}if(a.hasNormal){i.bindBuffer(i.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,e,f,g,h,j,k,l,m,n,p=a.count*3;for(n=0;n<p;n=n+9){c=a.normalArray;d=c[n];e=c[n+1];f=c[n+2];g=c[n+3];j=c[n+4];l=c[n+5];h=c[n+6];k=c[n+7];m=c[n+8];d=(d+g+h)/3;e=(e+j+k)/3;f=(f+l+m)/3;c[n]=d;c[n+1]=e;c[n+2]=f;c[n+3]=d;c[n+4]=e;c[n+5]=f;c[n+6]=d;c[n+7]=e;c[n+8]=f}}i.bufferData(i.ARRAY_BUFFER,a.normalArray,i.DYNAMIC_DRAW);i.enableVertexAttribArray(b.attributes.normal);i.vertexAttribPointer(b.attributes.normal,\n3,i.FLOAT,false,0,0)}i.drawArrays(i.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=n(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==F){F=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;d=0;for(c=f.length;d<c;++d){if(b){i.bindBuffer(i.ARRAY_BUFFER,e.vertexPositionBuffer);i.vertexAttribPointer(a.position,e.vertexPositionBuffer.itemSize,i.FLOAT,false,0,f[d].index*12);if(a.normal>=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER,\ne.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize,\ni.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g<\nd.numSupportedMorphTargets&&g<j.length;){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[j[g]]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=h[j[g]];g++}}else{var j=[],k=-1,l=0;h=f.morphTargetInfluences;var m,p=h.length;g=0;for(f.morphTargetBase!==-1&&(j[f.morphTargetBase]=true);g<d.numSupportedMorphTargets;){for(m=\n0;m<p;m++)if(!j[m]&&h[m]>k){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c[\"morphTarget\"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c[\"morphNormal\"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=\n0;for(h=e.__webglCustomAttributesList.length;g<h;g++){c=e.__webglCustomAttributesList[g];if(b[c.buffer.belongsToAttribute]>=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER,\ne.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>=\n0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof\nTHREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof\nTHREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights,\np=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn(\"DEPRECATED: Camera hasn't been added to a Scene. Adding it...\");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix,\nb.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;f.render=false;if(k.visible&&(!(k instanceof THREE.Mesh||k instanceof THREE.ParticleSystem)||!k.frustumCulled||\nWa.contains(k))){r(k,b);var o=f,q=o.object,s=o.buffer,t=void 0,t=t=void 0,t=q.material;if(t instanceof THREE.MeshFaceMaterial){t=s.materialIndex;if(t>=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&&\nm.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];k=f.object;if(k.visible){r(k,b);k=f.object.material;if(k.transparent){f.transparent=k;f.opaque=null}else{f.opaque=k;f.transparent=null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,\"\",b,n,p,true,d);l(a.__webglObjectsImmediate,\n\"\",b,n,p,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,\"opaque\",b,n,p,false);l(a.__webglObjectsImmediate,\"opaque\",b,n,p,false);j(a.__webglObjects,false,\"transparent\",b,n,p,true);l(a.__webglObjectsImmediate,\"transparent\",b,n,p,true)}h(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){i.bindTexture(i.TEXTURE_CUBE_MAP,c.__webglTexture);i.generateMipmap(i.TEXTURE_CUBE_MAP);\ni.bindTexture(i.TEXTURE_CUBE_MAP,null)}else{i.bindTexture(i.TEXTURE_2D,c.__webglTexture);i.generateMipmap(i.TEXTURE_2D);i.bindTexture(i.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)};this.renderImmediateObject=function(a,b,c,d,e){var f=n(a,b,c,d,e);F=-1;G.setObjectFaces(e);e.immediateRenderCallback?e.immediateRenderCallback(f,i,Wa):e.render(function(a){G.renderBufferImmediate(a,f,d.shading)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=\n[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,j=void 0,l=void 0,n=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.Geometry){if(l.geometryGroups===void 0){var r=l,s=void 0,t=void 0,u=void 0,v=void 0,w=void 0,z=void 0,y=void 0,A={},C=r.morphTargets.length,D=r.morphNormals.length;r.geometryGroups={};s=0;for(t=r.faces.length;s<\nt;s++){u=r.faces[s];v=u.materialIndex;z=v!==void 0?v:-1;A[z]===void 0&&(A[z]={hash:z,counter:0});y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:D});w=u instanceof THREE.Face3?3:4;if(r.geometryGroups[y].vertices+w>65535){A[z].counter=A[z].counter+1;y=A[z].hash+\"_\"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,\nnumMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer();\nF.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H<K;H++)F.__webglMorphTargetsBuffers.push(i.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=\n[];H=0;for(K=F.numMorphNormals;H<K;H++)F.__webglMorphNormalsBuffers.push(i.createBuffer())}G.info.memory.geometries++;var Q=n,J=g,O=J.geometry,M=Q.faces3,$=Q.faces4,P=M.length*3+$.length*4,Z=M.length*1+$.length*2,Y=M.length*3+$.length*4,R=c(J,Q),T=e(R),ea=d(R),ia=R.vertexColors?R.vertexColors:false;Q.__vertexArray=new Float32Array(P*3);if(ea)Q.__normalArray=new Float32Array(P*3);if(O.hasTangents)Q.__tangentArray=new Float32Array(P*4);if(ia)Q.__colorArray=new Float32Array(P*3);if(T){if(O.faceUvs.length>\n0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays=\n[];U=0;for(ha=Q.numMorphTargets;U<ha;U++)Q.__morphTargetsArrays.push(new Float32Array(P*3))}if(Q.numMorphNormals){Q.__morphNormalsArrays=[];U=0;for(ha=Q.numMorphNormals;U<ha;U++)Q.__morphNormalsArrays.push(new Float32Array(P*3))}Q.__webglFaceCount=Z*3;Q.__webglLineCount=Y*2;if(R.attributes){if(Q.__webglCustomAttributesList===void 0)Q.__webglCustomAttributesList=[];var Ra=void 0;for(Ra in R.attributes){var Ma=R.attributes[Ra],aa={},Ka;for(Ka in Ma)aa[Ka]=Ma[Ka];if(!aa.__webglInitialized||aa.createUniqueBuffers){aa.__webglInitialized=\ntrue;var La=1;aa.type===\"v2\"?La=2:aa.type===\"v3\"?La=3:aa.type===\"v4\"?La=4:aa.type===\"c\"&&(La=3);aa.size=La;aa.array=new Float32Array(P*La);aa.buffer=i.createBuffer();aa.buffer.belongsToAttribute=Ra;Ma.needsUpdate=true;aa.__original=Ma}Q.__webglCustomAttributesList.push(aa)}}Q.__inittedArrays=true;l.verticesNeedUpdate=true;l.morphTargetsNeedUpdate=true;l.elementsNeedUpdate=true;l.uvsNeedUpdate=true;l.normalsNeedUpdate=true;l.tangetsNeedUpdate=true;l.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){l=\ng.geometry;if(!l.__webglVertexBuffer){var Sa=l;Sa.__webglVertexBuffer=i.createBuffer();Sa.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;var oa=l,xa=oa.vertices.length;oa.__vertexArray=new Float32Array(xa*3);oa.__colorArray=new Float32Array(xa*3);oa.__webglVertexCount=xa;l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){l=g.geometry;if(!l.__webglVertexBuffer){var Ba=l;Ba.__webglVertexBuffer=i.createBuffer();Ba.__webglColorBuffer=i.createBuffer();G.info.memory.geometries++;\nvar Na=l,Ta=g,Wa=Na.vertices.length;Na.__vertexArray=new Float32Array(Wa*3);Na.__colorArray=new Float32Array(Wa*3);Na.__webglLineCount=Wa;b(Na,Ta);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){l=g.geometry;if(!l.__webglVertexBuffer){var $a=l;$a.__webglVertexBuffer=i.createBuffer();$a.__webglColorBuffer=i.createBuffer();G.info.geometries++;var Qa=l,Kb=g,lb=Qa.vertices.length;Qa.__vertexArray=new Float32Array(lb*3);Qa.__colorArray=new Float32Array(lb*\n3);Qa.__sortArray=[];Qa.__webglParticleCount=lb;b(Qa,Kb);l.verticesNeedUpdate=true;l.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){l=g.geometry;if(l instanceof THREE.BufferGeometry)k(h.__webglObjects,l,g);else for(j in l.geometryGroups){n=l.geometryGroups[j];k(h.__webglObjects,n,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){l=g.geometry;k(h.__webglObjects,l,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?\nh.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var bb=a.__objectsRemoved[0],gb=a;bb instanceof THREE.Mesh||bb instanceof THREE.ParticleSystem||bb instanceof THREE.Ribbon||bb instanceof THREE.Line?o(gb.__webglObjects,bb):bb instanceof THREE.Sprite?q(gb.__webglSprites,bb):bb instanceof THREE.LensFlare?\nq(gb.__webglFlares,bb):(bb instanceof THREE.ImmediateRenderObject||bb.immediateRenderCallback)&&o(gb.__webglObjectsImmediate,bb);bb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var ib=0,Lb=a.__webglObjects.length;ib<Lb;ib++){var jb=a.__webglObjects[ib].object,ga=jb.geometry,hb=void 0,ic=void 0,Ua=void 0;if(jb instanceof THREE.Mesh)if(ga instanceof THREE.BufferGeometry){ga.verticesNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=\nfalse}else{for(var Cb=0,nd=ga.geometryGroupsList.length;Cb<nd;Cb++){hb=ga.geometryGroupsList[Cb];Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.morphTargetsNeedUpdate||ga.elementsNeedUpdate||ga.uvsNeedUpdate||ga.normalsNeedUpdate||ga.colorsNeedUpdate||ga.tangetsNeedUpdate||ic){var ca=hb,od=jb,Xa=i.DYNAMIC_DRAW,pd=!ga.dynamic,bc=Ua;if(ca.__inittedArrays){var cd=d(bc),Tc=bc.vertexColors?bc.vertexColors:false,dd=e(bc),Ec=cd===THREE.SmoothShading,I=void 0,S=void 0,fb=void 0,N=void 0,\njc=void 0,Ob=void 0,kb=void 0,Fc=void 0,Fb=void 0,kc=void 0,lc=void 0,V=void 0,W=void 0,X=void 0,ma=void 0,mb=void 0,nb=void 0,ob=void 0,qc=void 0,pb=void 0,qb=void 0,rb=void 0,rc=void 0,sb=void 0,tb=void 0,ub=void 0,sc=void 0,vb=void 0,wb=void 0,xb=void 0,tc=void 0,yb=void 0,zb=void 0,Ab=void 0,uc=void 0,Pb=void 0,Qb=void 0,Rb=void 0,Gc=void 0,Sb=void 0,Tb=void 0,Ub=void 0,Hc=void 0,ja=void 0,ed=void 0,Vb=void 0,mc=void 0,nc=void 0,Ea=void 0,fd=void 0,Ca=void 0,Da=void 0,Wb=void 0,Gb=void 0,wa=0,\nAa=0,Hb=0,Ib=0,cb=0,Ja=0,na=0,Oa=0,ya=0,L=0,ba=0,B=0,Ya=void 0,Fa=ca.__vertexArray,vc=ca.__uvArray,wc=ca.__uv2Array,db=ca.__normalArray,qa=ca.__tangentArray,Ga=ca.__colorArray,ra=ca.__skinVertexAArray,sa=ca.__skinVertexBArray,ta=ca.__skinIndexArray,ua=ca.__skinWeightArray,Uc=ca.__morphTargetsArrays,Vc=ca.__morphNormalsArrays,Wc=ca.__webglCustomAttributesList,x=void 0,Bb=ca.__faceArray,Za=ca.__lineArray,Pa=od.geometry,qd=Pa.elementsNeedUpdate,gd=Pa.uvsNeedUpdate,rd=Pa.normalsNeedUpdate,sd=Pa.tangetsNeedUpdate,\ntd=Pa.colorsNeedUpdate,ud=Pa.morphTargetsNeedUpdate,cc=Pa.vertices,ka=ca.faces3,la=ca.faces4,za=Pa.faces,Xc=Pa.faceVertexUvs[0],Yc=Pa.faceVertexUvs[1],dc=Pa.skinVerticesA,ec=Pa.skinVerticesB,fc=Pa.skinIndices,Xb=Pa.skinWeights,Yb=Pa.morphTargets,Ic=Pa.morphNormals;if(Pa.verticesNeedUpdate){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Aa=Aa+9}I=0;for(S=la.length;I<\nS;I++){N=za[la[I]];V=cc[N.a];W=cc[N.b];X=cc[N.c];ma=cc[N.d];Fa[Aa]=V.x;Fa[Aa+1]=V.y;Fa[Aa+2]=V.z;Fa[Aa+3]=W.x;Fa[Aa+4]=W.y;Fa[Aa+5]=W.z;Fa[Aa+6]=X.x;Fa[Aa+7]=X.y;Fa[Aa+8]=X.z;Fa[Aa+9]=ma.x;Fa[Aa+10]=ma.y;Fa[Aa+11]=ma.z;Aa=Aa+12}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Fa,Xa)}if(ud){Ea=0;for(fd=Yb.length;Ea<fd;Ea++){I=ba=0;for(S=ka.length;I<S;I++){Wb=ka[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];Ca=Uc[Ea];Ca[ba]=V.x;Ca[ba+\n1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c}else rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z}ba=ba+9}I=0;for(S=la.length;I<S;I++){Wb=la[I];N=za[Wb];V=Yb[Ea].vertices[N.a];W=Yb[Ea].vertices[N.b];X=Yb[Ea].vertices[N.c];ma=Yb[Ea].vertices[N.d];Ca=Uc[Ea];\nCa[ba]=V.x;Ca[ba+1]=V.y;Ca[ba+2]=V.z;Ca[ba+3]=W.x;Ca[ba+4]=W.y;Ca[ba+5]=W.z;Ca[ba+6]=X.x;Ca[ba+7]=X.y;Ca[ba+8]=X.z;Ca[ba+9]=ma.x;Ca[ba+10]=ma.y;Ca[ba+11]=ma.z;if(bc.morphNormals){if(Ec){Gb=Ic[Ea].vertexNormals[Wb];pb=Gb.a;qb=Gb.b;rb=Gb.c;rc=Gb.d}else rc=rb=qb=pb=Ic[Ea].faceNormals[Wb];Da=Vc[Ea];Da[ba]=pb.x;Da[ba+1]=pb.y;Da[ba+2]=pb.z;Da[ba+3]=qb.x;Da[ba+4]=qb.y;Da[ba+5]=qb.z;Da[ba+6]=rb.x;Da[ba+7]=rb.y;Da[ba+8]=rb.z;Da[ba+9]=rc.x;Da[ba+10]=rc.y;Da[ba+11]=rc.z}ba=ba+12}i.bindBuffer(i.ARRAY_BUFFER,\nca.__webglMorphTargetsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Uc[Ea],Xa);if(bc.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglMorphNormalsBuffers[Ea]);i.bufferData(i.ARRAY_BUFFER,Vc[Ea],Xa)}}}if(Xb.length){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+\n2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;L=L+12}I=0;for(S=\nla.length;I<S;I++){N=za[la[I]];vb=Xb[N.a];wb=Xb[N.b];xb=Xb[N.c];tc=Xb[N.d];ua[L]=vb.x;ua[L+1]=vb.y;ua[L+2]=vb.z;ua[L+3]=vb.w;ua[L+4]=wb.x;ua[L+5]=wb.y;ua[L+6]=wb.z;ua[L+7]=wb.w;ua[L+8]=xb.x;ua[L+9]=xb.y;ua[L+10]=xb.z;ua[L+11]=xb.w;ua[L+12]=tc.x;ua[L+13]=tc.y;ua[L+14]=tc.z;ua[L+15]=tc.w;yb=fc[N.a];zb=fc[N.b];Ab=fc[N.c];uc=fc[N.d];ta[L]=yb.x;ta[L+1]=yb.y;ta[L+2]=yb.z;ta[L+3]=yb.w;ta[L+4]=zb.x;ta[L+5]=zb.y;ta[L+6]=zb.z;ta[L+7]=zb.w;ta[L+8]=Ab.x;ta[L+9]=Ab.y;ta[L+10]=Ab.z;ta[L+11]=Ab.w;ta[L+12]=uc.x;\nta[L+13]=uc.y;ta[L+14]=uc.z;ta[L+15]=uc.w;Pb=dc[N.a];Qb=dc[N.b];Rb=dc[N.c];Gc=dc[N.d];ra[L]=Pb.x;ra[L+1]=Pb.y;ra[L+2]=Pb.z;ra[L+3]=1;ra[L+4]=Qb.x;ra[L+5]=Qb.y;ra[L+6]=Qb.z;ra[L+7]=1;ra[L+8]=Rb.x;ra[L+9]=Rb.y;ra[L+10]=Rb.z;ra[L+11]=1;ra[L+12]=Gc.x;ra[L+13]=Gc.y;ra[L+14]=Gc.z;ra[L+15]=1;Sb=ec[N.a];Tb=ec[N.b];Ub=ec[N.c];Hc=ec[N.d];sa[L]=Sb.x;sa[L+1]=Sb.y;sa[L+2]=Sb.z;sa[L+3]=1;sa[L+4]=Tb.x;sa[L+5]=Tb.y;sa[L+6]=Tb.z;sa[L+7]=1;sa[L+8]=Ub.x;sa[L+9]=Ub.y;sa[L+10]=Ub.z;sa[L+11]=1;sa[L+12]=Hc.x;sa[L+13]=Hc.y;\nsa[L+14]=Hc.z;sa[L+15]=1;L=L+16}if(L>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===\n3&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2]}else ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;ya=ya+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];kb=N.vertexColors;Fc=N.color;if(kb.length===4&&Tc===THREE.VertexColors){sb=kb[0];tb=kb[1];ub=kb[2];sc=kb[3]}else sc=ub=tb=sb=Fc;Ga[ya]=sb.r;Ga[ya+1]=sb.g;Ga[ya+2]=sb.b;Ga[ya+3]=tb.r;Ga[ya+4]=tb.g;Ga[ya+5]=tb.b;Ga[ya+6]=ub.r;Ga[ya+7]=ub.g;Ga[ya+8]=ub.b;Ga[ya+\n9]=sc.r;Ga[ya+10]=sc.g;Ga[ya+11]=sc.b;ya=ya+12}if(ya>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Fb=N.vertexTangents;mb=Fb[0];nb=Fb[1];ob=Fb[2];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;na=na+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Fb=N.vertexTangents;mb=Fb[0];\nnb=Fb[1];ob=Fb[2];qc=Fb[3];qa[na]=mb.x;qa[na+1]=mb.y;qa[na+2]=mb.z;qa[na+3]=mb.w;qa[na+4]=nb.x;qa[na+5]=nb.y;qa[na+6]=nb.z;qa[na+7]=nb.w;qa[na+8]=ob.x;qa[na+9]=ob.y;qa[na+10]=ob.z;qa[na+11]=ob.w;qa[na+12]=qc.x;qa[na+13]=qc.y;qa[na+14]=qc.z;qa[na+15]=qc.w;na=na+16}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglTangentBuffer);i.bufferData(i.ARRAY_BUFFER,qa,Xa)}if(rd&&cd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===3&&Ec)for(ja=0;ja<3;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+\n1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<3;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}I=0;for(S=la.length;I<S;I++){N=za[la[I]];jc=N.vertexNormals;Ob=N.normal;if(jc.length===4&&Ec)for(ja=0;ja<4;ja++){Vb=jc[ja];db[Ja]=Vb.x;db[Ja+1]=Vb.y;db[Ja+2]=Vb.z;Ja=Ja+3}else for(ja=0;ja<4;ja++){db[Ja]=Ob.x;db[Ja+1]=Ob.y;db[Ja+2]=Ob.z;Ja=Ja+3}}i.bindBuffer(i.ARRAY_BUFFER,ca.__webglNormalBuffer);i.bufferData(i.ARRAY_BUFFER,db,Xa)}if(gd&&Xc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];kc=\nXc[fb];if(kc!==void 0)for(ja=0;ja<3;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}I=0;for(S=la.length;I<S;I++){fb=la[I];N=za[fb];kc=Xc[fb];if(kc!==void 0)for(ja=0;ja<4;ja++){mc=kc[ja];vc[Hb]=mc.u;vc[Hb+1]=mc.v;Hb=Hb+2}}if(Hb>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I<S;I++){fb=ka[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<3;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}I=0;for(S=la.length;I<S;I++){fb=\nla[I];N=za[fb];lc=Yc[fb];if(lc!==void 0)for(ja=0;ja<4;ja++){nc=lc[ja];wc[Ib]=nc.u;wc[Ib+1]=nc.v;Ib=Ib+2}}if(Ib>0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+2;cb=cb+3;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+2;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Oa=Oa+6;wa=wa+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];Bb[cb]=wa;Bb[cb+1]=wa+1;Bb[cb+2]=wa+3;Bb[cb+3]=wa+1;Bb[cb+4]=wa+2;Bb[cb+5]=\nwa+3;cb=cb+6;Za[Oa]=wa;Za[Oa+1]=wa+1;Za[Oa+2]=wa;Za[Oa+3]=wa+3;Za[Oa+4]=wa+1;Za[Oa+5]=wa+2;Za[Oa+6]=wa+2;Za[Oa+7]=wa+3;Oa=Oa+8;wa=wa+4}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglFaceBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Bb,Xa);i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,ca.__webglLineBuffer);i.bufferData(i.ELEMENT_ARRAY_BUFFER,Za,Xa)}if(Wc){ja=0;for(ed=Wc.length;ja<ed;ja++){x=Wc[ja];if(x.__original.needsUpdate){B=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];B=B+3}I=0;for(S=la.length;I<S;I++){N=za[la[I]];x.array[B]=x.value[N.a];x.array[B+1]=x.value[N.b];x.array[B+2]=x.value[N.c];x.array[B+3]=x.value[N.d];B=B+4}}else{if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){Ya=x.value[ka[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;B=B+3}I=0;for(S=la.length;I<S;I++){Ya=x.value[la[I]];x.array[B]=Ya;x.array[B+1]=Ya;x.array[B+2]=Ya;x.array[B+3]=Ya;B=B+4}}}else if(x.size===\n2)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}else{if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;B=B+6}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=W.x;x.array[B+3]=W.y;x.array[B+4]=X.x;x.array[B+5]=X.y;x.array[B+6]=ma.x;x.array[B+7]=ma.y;B=B+8}}}else if(x.size===3){var da;da=x.type===\"c\"?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<\nS;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+\n6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}else if(x.boundTo===\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V[da[0]];x.array[B+1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];B=B+9}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V[da[0]];x.array[B+\n1]=V[da[1]];x.array[B+2]=V[da[2]];x.array[B+3]=W[da[0]];x.array[B+4]=W[da[1]];x.array[B+5]=W[da[2]];x.array[B+6]=X[da[0]];x.array[B+7]=X[da[1]];x.array[B+8]=X[da[2]];x.array[B+9]=ma[da[0]];x.array[B+10]=ma[da[1]];x.array[B+11]=ma[da[2]];B=B+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo===\"vertices\"){I=0;for(S=ka.length;I<S;I++){N=za[ka[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+\n6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){N=za[la[I]];V=x.value[N.a];W=x.value[N.b];X=x.value[N.c];ma=x.value[N.d];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}else if(x.boundTo===\n\"faces\"){I=0;for(S=ka.length;I<S;I++){X=W=V=Ya=x.value[ka[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+10]=X.z;x.array[B+11]=X.w;B=B+12}I=0;for(S=la.length;I<S;I++){ma=X=W=V=Ya=x.value[la[I]];x.array[B]=V.x;x.array[B+1]=V.y;x.array[B+2]=V.z;x.array[B+3]=V.w;x.array[B+4]=W.x;x.array[B+5]=W.y;x.array[B+6]=W.z;x.array[B+7]=W.w;x.array[B+8]=X.x;x.array[B+9]=X.y;x.array[B+\n10]=X.z;x.array[B+11]=X.w;x.array[B+12]=ma.x;x.array[B+13]=ma.y;x.array[B+14]=ma.z;x.array[B+15]=ma.w;B=B+16}}i.bindBuffer(i.ARRAY_BUFFER,x.buffer);i.bufferData(i.ARRAY_BUFFER,x.array,Xa)}}}if(pd){delete ca.__inittedArrays;delete ca.__colorArray;delete ca.__normalArray;delete ca.__tangentArray;delete ca.__uvArray;delete ca.__uv2Array;delete ca.__faceArray;delete ca.__vertexArray;delete ca.__lineArray;delete ca.__skinVertexAArray;delete ca.__skinVertexBArray;delete ca.__skinIndexArray;delete ca.__skinWeightArray}}}}ga.verticesNeedUpdate=\nfalse;ga.morphTargetsNeedUpdate=false;ga.elementsNeedUpdate=false;ga.uvsNeedUpdate=false;ga.normalsNeedUpdate=false;ga.colorsNeedUpdate=false;ga.tangetsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof THREE.Ribbon){if(ga.verticesNeedUpdate||ga.colorsNeedUpdate){var Zb=ga,hd=i.DYNAMIC_DRAW,xc=void 0,yc=void 0,Jc=void 0,$b=void 0,Kc=void 0,id=Zb.vertices,jd=Zb.colors,vd=id.length,wd=jd.length,Lc=Zb.__vertexArray,Mc=Zb.__colorArray,xd=Zb.colorsNeedUpdate;if(Zb.verticesNeedUpdate){for(xc=0;xc<\nvd;xc++){Jc=id[xc];$b=xc*3;Lc[$b]=Jc.x;Lc[$b+1]=Jc.y;Lc[$b+2]=Jc.z}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Lc,hd)}if(xd){for(yc=0;yc<wd;yc++){Kc=jd[yc];$b=yc*3;Mc[$b]=Kc.r;Mc[$b+1]=Kc.g;Mc[$b+2]=Kc.b}i.bindBuffer(i.ARRAY_BUFFER,Zb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Mc,hd)}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false}else if(jb instanceof THREE.Line){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);if(ga.verticesNeedUpdate||ga.colorsNeedUpdate||ic){var Jb=\nga,Zc=i.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Nc=void 0,va=void 0,Oc=void 0,kd=Jb.vertices,ld=Jb.colors,yd=kd.length,zd=ld.length,Pc=Jb.__vertexArray,Qc=Jb.__colorArray,Ad=Jb.colorsNeedUpdate,$c=Jb.__webglCustomAttributesList,Rc=void 0,md=void 0,Ia=void 0,oc=void 0,Va=void 0,pa=void 0;if(Jb.verticesNeedUpdate){for(zc=0;zc<yd;zc++){Nc=kd[zc];va=zc*3;Pc[va]=Nc.x;Pc[va+1]=Nc.y;Pc[va+2]=Nc.z}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglVertexBuffer);i.bufferData(i.ARRAY_BUFFER,Pc,Zc)}if(Ad){for(Ac=0;Ac<zd;Ac++){Oc=\nld[Ac];va=Ac*3;Qc[va]=Oc.r;Qc[va+1]=Oc.g;Qc[va+2]=Oc.b}i.bindBuffer(i.ARRAY_BUFFER,Jb.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Qc,Zc)}if($c){Rc=0;for(md=$c.length;Rc<md;Rc++){pa=$c[Rc];if(pa.needsUpdate&&(pa.boundTo===void 0||pa.boundTo===\"vertices\")){va=0;oc=pa.value.length;if(pa.size===1)for(Ia=0;Ia<oc;Ia++)pa.array[Ia]=pa.value[Ia];else if(pa.size===2)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;va=va+2}else if(pa.size===3)if(pa.type===\"c\")for(Ia=0;Ia<oc;Ia++){Va=\npa.value[Ia];pa.array[va]=Va.r;pa.array[va+1]=Va.g;pa.array[va+2]=Va.b;va=va+3}else for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;va=va+3}else if(pa.size===4)for(Ia=0;Ia<oc;Ia++){Va=pa.value[Ia];pa.array[va]=Va.x;pa.array[va+1]=Va.y;pa.array[va+2]=Va.z;pa.array[va+3]=Va.w;va=va+4}i.bindBuffer(i.ARRAY_BUFFER,pa.buffer);i.bufferData(i.ARRAY_BUFFER,pa.array,Zc)}}}}ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}else if(jb instanceof\nTHREE.ParticleSystem){Ua=c(jb,hb);ic=Ua.attributes&&p(Ua);(ga.verticesNeedUpdate||ga.colorsNeedUpdate||jb.sortParticles||ic)&&f(ga,i.DYNAMIC_DRAW,jb);ga.verticesNeedUpdate=false;ga.colorsNeedUpdate=false;Ua.attributes&&m(Ua)}}};this.initMaterial=function(a,b,c,d){var e,f,g;a instanceof THREE.MeshDepthMaterial?g=\"depth\":a instanceof THREE.MeshNormalMaterial?g=\"normal\":a instanceof THREE.MeshBasicMaterial?g=\"basic\":a instanceof THREE.MeshLambertMaterial?g=\"lambert\":a instanceof THREE.MeshPhongMaterial?\ng=\"phong\":a instanceof THREE.LineBasicMaterial?g=\"basic\":a instanceof THREE.ParticleBasicMaterial&&(g=\"particle_basic\");if(g){var h=THREE.ShaderLib[g];a.uniforms=THREE.UniformsUtils.clone(h.uniforms);a.vertexShader=h.vertexShader;a.fragmentShader=h.fragmentShader}var j,k,l,m,n;j=m=n=h=0;for(k=b.length;j<k;j++){l=b[j];if(!l.onlyShadow){l instanceof THREE.DirectionalLight&&m++;l instanceof THREE.PointLight&&n++;l instanceof THREE.SpotLight&&h++}}if(n+h+m<=M){k=m;l=n;m=h}else{k=Math.ceil(M*m/(n+m));\nm=l=M-k}var p=0,h=0;for(n=b.length;h<n;h++){j=b[h];if(j.castShadow){j instanceof THREE.SpotLight&&p++;j instanceof THREE.DirectionalLight&&!j.shadowCascade&&p++}}var o=50;if(d!==void 0&&d instanceof THREE.SkinnedMesh)o=d.bones.length;var q;a:{n=a.fragmentShader;j=a.vertexShader;var h=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:o,morphTargets:a.morphTargets,\nmorphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:k,maxPointLights:l,maxSpotLights:m,maxShadows:p,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:d&&d.doubleSided},r,d=[];if(g)d.push(g);else{d.push(n);d.push(j)}for(r in c){d.push(r);\nd.push(c[r])}g=d.join();r=0;for(d=T.length;r<d;r++)if(T[r].code===g){q=T[r].program;break a}r=i.createProgram();d=[\"precision \"+z+\" float;\",oa>0?\"#define VERTEX_TEXTURES\":\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,\"#define MAX_BONES \"+\nc.maxBones,c.map?\"#define USE_MAP\":\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.skinning?\"#define USE_SKINNING\":\"\",c.morphTargets?\"#define USE_MORPHTARGETS\":\"\",c.morphNormals?\"#define USE_MORPHNORMALS\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\n\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",c.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 objectMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinVertexA;\\nattribute vec4 skinVertexB;\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");\nk=[\"precision \"+z+\" float;\",\"#define MAX_DIR_LIGHTS \"+c.maxDirLights,\"#define MAX_POINT_LIGHTS \"+c.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+c.maxSpotLights,\"#define MAX_SHADOWS \"+c.maxShadows,c.alphaTest?\"#define ALPHATEST \"+c.alphaTest:\"\",G.gammaInput?\"#define GAMMA_INPUT\":\"\",G.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",G.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",c.useFog&&c.fog?\"#define USE_FOG\":\"\",c.useFog&&c.fog instanceof THREE.FogExp2?\"#define FOG_EXP2\":\"\",c.map?\"#define USE_MAP\":\n\"\",c.envMap?\"#define USE_ENVMAP\":\"\",c.lightMap?\"#define USE_LIGHTMAP\":\"\",c.vertexColors?\"#define USE_COLOR\":\"\",c.metal?\"#define METAL\":\"\",c.perPixel?\"#define PHONG_PER_PIXEL\":\"\",c.wrapAround?\"#define WRAP_AROUND\":\"\",c.doubleSided?\"#define DOUBLE_SIDED\":\"\",c.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",c.shadowMapSoft?\"#define SHADOWMAP_SOFT\":\"\",c.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",c.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");\ni.attachShader(r,t(\"fragment\",k+n));i.attachShader(r,t(\"vertex\",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+i.getProgramParameter(r,i.VALIDATE_STATUS)+\", gl error [\"+i.getError()+\"]\");r.uniforms={};r.attributes={};var s,d=[\"viewMatrix\",\"modelViewMatrix\",\"projectionMatrix\",\"normalMatrix\",\"objectMatrix\",\"cameraPosition\",\"boneGlobalMatrices\",\"morphTargetInfluences\"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d<h;d++){n=\ns[d];r.uniforms[n]=i.getUniformLocation(r,n)}d=[\"position\",\"normal\",\"uv\",\"uv2\",\"tangent\",\"color\",\"skinVertexA\",\"skinVertexB\",\"skinIndex\",\"skinWeight\"];for(s=0;s<c.maxMorphTargets;s++)d.push(\"morphTarget\"+s);for(s=0;s<c.maxMorphNormals;s++)d.push(\"morphNormal\"+s);for(q in b)d.push(q);q=d;s=0;for(b=q.length;s<b;s++){c=q[s];r.attributes[c]=i.getAttribLocation(r,c)}r.id=T.length;T.push({program:r,code:g});G.info.memory.programs=T.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&i.enableVertexAttribArray(q.position);\nq.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets=\n0;r=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++){s=r+f;if(q[s]>=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b===\"ccw\"?i.frontFace(i.CCW):i.frontFace(i.CW);a===\"back\"?i.cullFace(i.BACK):\na===\"front\"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending=\nfunction(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND);\ni.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\na.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof\nTHREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer();\ni.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D,\n0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;\nc=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type:\nTHREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};\nTHREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};\nTHREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};\nTHREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};\nTHREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};\nTHREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}};\nTHREE.ColorUtils.__hsv={h:0,s:0,v:0};\nTHREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o<a.materials.length;o++)m[a.materials[o].id]=o;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var o=0,q=h.length;o<q;o++){var n=h[o].clone();c&&c.multiplyVector3(n);g.push(n)}o=0;for(q=l.length;o<q;o++){var g=\nl[o],r,u,t=g.vertexNormals,y=g.vertexColors;g instanceof THREE.Face3?r=new THREE.Face3(g.a+e,g.b+e,g.c+e):g instanceof THREE.Face4&&(r=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));r.normal.copy(g.normal);d&&d.multiplyVector3(r.normal);h=0;for(n=t.length;h<n;h++){u=t[h].clone();d&&d.multiplyVector3(u);r.vertexNormals.push(u)}r.color.copy(g.color);h=0;for(n=y.length;h<n;h++){u=y[h];r.vertexColors.push(u.clone())}if(g.materialIndex!==void 0){h=f.materials[g.materialIndex];n=h.id;y=m[n];if(y===void 0){y=\na.materials.length;m[n]=y;a.materials.push(h)}r.materialIndex=y}r.centroid.copy(g.centroid);c&&c.multiplyVector3(r.centroid);j.push(r)}o=0;for(q=p.length;o<q;o++){c=p[o];d=[];h=0;for(n=c.length;h<n;h++)d.push(new THREE.UV(c[h].u,c[h].v));k.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,e=a.faces,f=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=e.length;a<c;a++)b.faces.push(e[a].clone());a=0;\nfor(c=f.length;a<c;a++){for(var d=f[a],e=[],g=0,h=d.length;g<h;g++)e.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(e)}return b},randomPointInTriangle:function(a,b,c){var d,e,f,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();e=THREE.GeometryUtils.random();if(d+e>1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof\nTHREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()*\n(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(d,e,b):THREE.GeometryUtils.randomPointInTriangle(e,f,b)}},randomPointsInGeometry:function(a,b){function c(a){function b(c,d){if(d<c)return c;var e=c+Math.floor((d-c)/2);return l[e]>a?b(c,e-1):l[e]<a?b(e+1,d):e}return b(0,l.length-1)}var d,e,f=a.faces,g=a.vertices,h=f.length,j=0,l=[],k,p,m,o;for(e=0;e<h;e++){d=f[e];if(d instanceof THREE.Face3){k=g[d.a];p=g[d.b];m=g[d.c];d._area=THREE.GeometryUtils.triangleArea(k,p,m)}else if(d instanceof THREE.Face4){k=\ng[d.a];p=g[d.b];m=g[d.c];o=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(k,p,o);d._area2=THREE.GeometryUtils.triangleArea(p,m,o);d._area=d._area1+d._area2}j=j+d._area;l[e]=j}d=[];for(e=0;e<b;e++){g=THREE.GeometryUtils.random()*j;g=c(g);d[e]=THREE.GeometryUtils.randomPointInFace(f[g],a,true)}return d},triangleArea:function(a,b,c){var d,e=THREE.GeometryUtils.__v1;e.sub(a,b);d=e.length();e.sub(a,c);a=e.length();e.sub(b,c);c=e.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();\nvar b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],e=0,f=d.length;e<f;e++){if(d[e].u!==1)d[e].u=d[e].u-Math.floor(d[e].u);if(d[e].v!==1)d[e].v=d[e].v-Math.floor(d[e].v)}},triangulateQuads:function(a){var b,c,d,e,f=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<\nc;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){e=d.a;var j=d.b,l=d.c,k=d.d,p=new THREE.Face3,m=new THREE.Face3;p.color.copy(d.color);m.color.copy(d.color);p.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;p.a=e;p.b=j;p.c=k;m.a=j;m.b=l;m.c=k;if(d.vertexColors.length===4){p.vertexColors[0]=d.vertexColors[0].clone();p.vertexColors[1]=d.vertexColors[1].clone();p.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();\nm.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}f.push(p,m);d=0;for(e=a.faceVertexUvs.length;d<e;d++)if(a.faceVertexUvs[d].length){p=a.faceVertexUvs[d][b];j=p[1];l=p[2];k=p[3];p=[p[0].clone(),j.clone(),k.clone()];j=[j.clone(),l.clone(),k.clone()];h[d].push(p,j)}d=0;for(e=a.faceUvs.length;d<e;d++)if(a.faceUvs[d].length){j=a.faceUvs[d][b];g[d].push(j,j)}}else{f.push(d);d=0;for(e=a.faceUvs.length;d<e;d++)g[d].push(a.faceUvs[d]);d=0;for(e=a.faceVertexUvs.length;d<\ne;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=f;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var e=b.length,f=a.faces[c];if(f instanceof THREE.Face4){var g=f.a,h=f.b,j=f.c,g=a.vertices[g],h=a.vertices[h],j=a.vertices[j],l=a.vertices[f.d];b.push(g.clone());b.push(h.clone());b.push(j.clone());b.push(l.clone());f.a=e;f.b=e+1;f.c=e+2;f.d=e+3}else{g=f.a;\nh=f.b;j=f.c;g=a.vertices[g];h=a.vertices[h];j=a.vertices[j];b.push(g.clone());b.push(h.clone());b.push(j.clone());f.a=e;f.b=e+1;f.c=e+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,e,f,g,h,j,l,k,p,m,o,q,n,r,u,t,y,s,w=[],H=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)H[c]=[];c=0;for(d=a.faces.length;c<d;c++){e=a.faces[c];if(e instanceof THREE.Face3){f=e.a;g=e.b;h=e.c;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];o=l.distanceTo(k);q=k.distanceTo(p);m=l.distanceTo(p);if(o>\nb||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=\nj;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone();\nl.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];if(e===\n0){k=s.clone();k.lerpSelf(h,0.5);l=[s.clone(),k.clone(),y.clone()];h=[k.clone(),h.clone(),y.clone()]}else if(e===1){k=h.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),y.clone(),s.clone()]}else{k=s.clone();k.lerpSelf(y,0.5);l=[s.clone(),h.clone(),k.clone()];h=[k.clone(),h.clone(),y.clone()]}H[f].push(l,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}else{f=e.a;g=e.b;h=e.c;j=e.d;l=a.vertices[f];k=a.vertices[g];p=a.vertices[h];m=\na.vertices[j];o=l.distanceTo(k);q=k.distanceTo(p);n=p.distanceTo(m);r=l.distanceTo(m);if(o>b||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f);\ny.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone();\nf.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k);\nf=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){l=a.faceVertexUvs[f][c];s=l[0];h=l[1];y=l[2];l=l[3];if(e===0){k=s.clone();k.lerpSelf(h,0.5);p=y.clone();p.lerpSelf(l,0.5);s=[s.clone(),k.clone(),p.clone(),l.clone()];h=[k.clone(),h.clone(),y.clone(),p.clone()]}else{k=h.clone();k.lerpSelf(y,0.5);p=l.clone();p.lerpSelf(s,0.5);s=[s.clone(),h.clone(),k.clone(),p.clone()];h=[p.clone(),k.clone(),y.clone(),l.clone()]}H[f].push(s,h)}}else{w.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)H[f].push(a.faceVertexUvs[f][c])}}}a.faces=\nw;a.faceVertexUvs=H}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;\nTHREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(a,b,c){var d=new Image,e=new THREE.Texture(d,b);d.onload=function(){e.needsUpdate=true;c&&c(this)};d.crossOrigin=this.crossOrigin;d.src=a;return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b),b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+1;if(e.loadCount===6)f.needsUpdate=true;c&&c(this)};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,\nb){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement(\"canvas\");f.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,j=g.createImageData(d,e),l=j.data,k=0;k<d;k++)for(var p=0;p<e;p++){var m=p-1<0?0:p-1,o=p+1>e-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0,\n-1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o<q;o++){var n=r[o],t=r[(o+1)%q],n=[n[0]-u[0],n[1]-u[1],n[2]-u[2]],t=[t[0]-u[0],t[1]-u[1],t[2]-u[2]];m.push(c([n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]))}r=[0,0,0];for(o=0;o<m.length;o++){r[0]=r[0]+m[o][0];r[1]=r[1]+m[o][1];r[2]=r[2]+m[o][2]}r[0]=r[0]/m.length;r[1]=\nr[1]/m.length;r[2]=r[2]/m.length;u=(p*d+k)*4;l[u]=(r[0]+1)/2*255|0;l[u+1]=(r[1]+0.5)*255|0;l[u+2]=r[2]*255|0;l[u+3]=255}g.putImageData(j,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};\nTHREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);\nb.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);\nelse if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);\nb.rotation=a.rotation;b.opacity=a.opacity;b.uvOffset.copy(a.uvOffset);b.uvScale.copy(a.uvScale)}else if(a instanceof THREE.LOD)b=new THREE.LOD;else if(a instanceof THREE.MarchingCubes){b=new THREE.MarchingCubes(a.resolution,a.material);b.field.set(a.field);b.isolation=a.isolation}else a instanceof THREE.Object3D&&(b=new THREE.Object3D);b.name=a.name;b.parent=a.parent;b.up.copy(a.up);b.position.copy(a.position);b.rotation instanceof THREE.Vector3&&b.rotation.copy(a.rotation);b.eulerOrder=a.eulerOrder;\nb.scale.copy(a.scale);b.dynamic=a.dynamic;b.doubleSided=a.doubleSided;b.flipSided=a.flipSided;b.renderDepth=a.renderDepth;b.rotationAutoUpdate=a.rotationAutoUpdate;b.matrix.copy(a.matrix);b.matrixWorld.copy(a.matrixWorld);b.matrixRotationWorld.copy(a.matrixRotationWorld);b.matrixAutoUpdate=a.matrixAutoUpdate;b.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;b.quaternion.copy(a.quaternion);b.useQuaternion=a.useQuaternion;b.boundRadius=a.boundRadius;b.boundRadiusScale=a.boundRadiusScale;b.visible=a.visible;\nb.castShadow=a.castShadow;b.receiveShadow=a.receiveShadow;b.frustumCulled=a.frustumCulled;for(var c=0;c<a.children.length;c++){var d=THREE.SceneUtils.cloneObject(a.children[c]);b.children[c]=d;d.parent=b}if(a instanceof THREE.LOD)for(c=0;c<a.LODs.length;c++)b.LODs[c]={visibleAtDistance:a.LODs[c].visibleAtDistance,object3D:b.children[c]};return b},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);\nb.remove(a);c.add(a)}};\nTHREE.WebGLRenderer&&(THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:\"f\",value:1.02},mFresnelBias:{type:\"f\",value:0.1},mFresnelPower:{type:\"f\",value:2},mFresnelScale:{type:\"f\",value:1},tCube:{type:\"t\",value:1,texture:null}},fragmentShader:\"uniform samplerCube tCube;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\\nrefractedColor.a = 1.0;\\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\\n}\",vertexShader:\"uniform float mRefractionRatio;\\nuniform float mFresnelBias;\\nuniform float mFresnelScale;\\nuniform float mFresnelPower;\\nvarying vec3 vReflect;\\nvarying vec3 vRefract[3];\\nvarying float vReflectionFactor;\\nvoid main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\\nvec3 I = mPosition.xyz - cameraPosition;\\nvReflect = reflect( I, nWorld );\\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"},\nnormal:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},tDiffuse:{type:\"t\",value:0,texture:null},tCube:{type:\"t\",value:1,texture:null},tNormal:{type:\"t\",value:2,texture:null},tSpecular:{type:\"t\",value:3,texture:null},tAO:{type:\"t\",value:4,texture:null},tDisplacement:{type:\"t\",value:5,texture:null},uNormalScale:{type:\"f\",\nvalue:1},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},uReflectivity:{type:\"f\",value:0.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),\nfragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform float uNormalScale;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\\nfloat pointDistance = vPointLight[ i ].w;\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\\nif ( enableReflection ) {\\nvec3 wPos = cameraPosition - vViewPosition;\\nvec3 vReflect = reflect( normalize( wPos ), normal );\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\nvViewPosition = -mvPosition.xyz;\\nvNormal = normalMatrix * normal;\\nvTangent = normalMatrix * tangent.xyz;\\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\\nvUv = uv * uRepeat + uOffset;\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#ifdef VERTEX_TEXTURES\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\\ngl_Position = projectionMatrix * displacedPosition;\\n#else\\ngl_Position = projectionMatrix * mvPosition;\\n#endif\",\nTHREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:1,texture:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vViewPosition;\\nvoid main() {\\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\\nvViewPosition = cameraPosition - mPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vViewPosition;\\nvoid main() {\\nvec3 wPos = cameraPosition - vViewPosition;\\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\\n}\"}}});\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};\nTHREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};\nTHREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b};\nTHREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)};\nTHREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve;\nTHREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;\nTHREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};\nTHREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;\nTHREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b});\nTHREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a<c.length;){if(c[a]>=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++){b=b+this.curves[c].getLength();a.push(b)}return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e;b=c=Number.NEGATIVE_INFINITY;d=e=Number.POSITIVE_INFINITY;var f,g,h,j;j=new THREE.Vector2;g=0;for(h=a.length;g<h;g++){f=a[g];if(f.x>b)b=f.x;else if(f.x<d)d=f.x;if(f.y>c)c=f.y;else if(f.y<c)e=f.y;j.addSelf(f.x,f.y)}return{minX:d,minY:e,maxX:b,maxY:c,centroid:j.divideScalar(h)}};THREE.CurvePath.prototype.createPointsGeometry=function(a){return this.createGeometry(this.getPoints(a,true))};\nTHREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){return this.createGeometry(this.getSpacedPoints(a,true))};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;if(!b)b=this.bends;d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,j;d=0;for(e=a.length;d<e;d++){f=a[d];g=f.x;h=f.y;j=g/c.maxX;j=b.getUtoTmapping(j,g);g=b.getPoint(j);h=b.getNormalVector(j).multiplyScalar(h);f.x=g.x+h.x;f.y=g.y+h.y}return a};\nTHREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==void 0&&(a[b]=[]);a[b].indexOf(c)===-1&&a[b].push(c)};this.dispatchEvent=function(b){for(var c in a[b.type])a[b.type][c](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);d!==-1&&a[b].splice(d,1)}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=new THREE.Object3D;THREE.Gyroscope.prototype.constructor=THREE.Gyroscope;\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);\nthis.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=new THREE.CurvePath;THREE.Path.prototype.constructor=THREE.Path;THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args;this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b)));this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args;this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d)));this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args;this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f)));this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);this.curves.push(new THREE.SplineCurve(c));this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};\nTHREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1],h=new THREE.ArcCurve(h.x+a,h.y+b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=new THREE.ArcCurve(a,b,c,d,e,f);this.curves.push(h);h=h.getPoint(f?1:0);g.push(h.x);g.push(h.y);this.actions.push({action:THREE.PathActions.ARC,args:g})};THREE.Path.prototype.getSpacedPoints=function(a){a||(a=40);for(var b=[],c=0;c<a;c++)b.push(this.getPoint(c/a));return b};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints){console.log(\"tata\");return this.getSpacedPoints(a,b)}var a=a||12,c=[],d,e,f,g,h,j,l,k,p,m,o,q,n;d=0;for(e=this.actions.length;d<e;d++){f=this.actions[d];g=f.action;f=f.args;switch(g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];j=f[3];p=f[0];m=f[1];if(c.length>0){g=c[c.length-1];\no=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g,\nn))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length-\n1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h<j;h++){l=g[h];k=l.x;p=l.y;l.x=a*k+b*p+c;l.y=d*p+e*k+f}return g};\nTHREE.Path.prototype.debug=function(a){var b=this.getBoundingBox();if(!a){a=document.createElement(\"canvas\");a.setAttribute(\"width\",b.maxX+100);a.setAttribute(\"height\",b.maxY+100);document.body.appendChild(a)}b=a.getContext(\"2d\");b.fillStyle=\"white\";b.fillRect(0,0,a.width,a.height);b.strokeStyle=\"black\";b.beginPath();var c,d,e,a=0;for(c=this.actions.length;a<c;a++){d=this.actions[a];e=d.args;d=d.action;d!=THREE.PathActions.CSPLINE_THRU&&b[d].apply(b,e)}b.stroke();b.closePath();b.strokeStyle=\"red\";\nd=this.getPoints();a=0;for(c=d.length;a<c;a++){e=d[a];b.beginPath();b.arc(e.x,e.y,1.5,0,Math.PI*2,false);b.stroke();b.closePath()}};\nTHREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a<b;a++){c=this.actions[a];d=c.args;c=c.action;if(c==THREE.PathActions.MOVE_TO&&f.actions.length!=0){e.push(f);f=new THREE.Path}f[c].apply(f,d)}f.actions.length!=0&&e.push(f);if(e.length==0)return[];var g;d=[];a=!THREE.Shape.Utils.isClockWise(e[0].getPoints());if(e.length==1){f=e[0];g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves;d.push(g);return d}if(a){g=new THREE.Shape;a=0;for(b=e.length;a<\nb;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g.actions=f.actions;g.curves=f.curves;d.push(g);g=new THREE.Shape}else g.holes.push(f)}}else{a=0;for(b=e.length;a<b;a++){f=e[a];if(THREE.Shape.Utils.isClockWise(f.getPoints())){g&&d.push(g);g=new THREE.Shape;g.actions=f.actions;g.curves=f.curves}else g.holes.push(f)}d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=new THREE.Path;THREE.Shape.prototype.constructor=THREE.Path;\nTHREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};\nTHREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={removeHoles:function(a,b){var c=a.concat(),d=c.concat(),e,f,g,h,j,l,k,p,m,o,q=[];for(j=0;j<b.length;j++){l=b[j];Array.prototype.push.apply(d,l);f=Number.POSITIVE_INFINITY;for(e=0;e<l.length;e++){m=l[e];o=[];for(p=0;p<c.length;p++){k=c[p];k=m.distanceToSquared(k);o.push(k);if(k<f){f=k;g=e;h=p}}}e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+\n-1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c,\nisolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f<g;f++){j=d[f].x+\":\"+d[f].y;l[j]!==void 0&&console.log(\"Duplicate point\",j);l[j]=f}f=0;for(g=c.length;f<g;f++){h=c[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}f=0;for(g=e.length;f<g;f++){h=e[f];for(d=0;d<3;d++){j=h[d].x+\":\"+h[d].y;j=l[j];j!==void 0&&(h[d]=j)}}return c.concat(e)},\nisClockWise:function(a){return THREE.FontUtils.Triangulate.area(a)<0},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+\nthis.b3p3(a,e)}};THREE.TextPath=function(a,b){THREE.Path.call(this);this.parameters=b||{};this.set(a)};THREE.TextPath.prototype.set=function(a,b){b=b||this.parameters;this.text=a;var c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:\"helvetiker\",e=b.weight!==void 0?b.weight:\"normal\",f=b.style!==void 0?b.style:\"normal\";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f};\nTHREE.TextPath.prototype.toShapes=function(){for(var a=THREE.FontUtils.drawText(this.text).paths,b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,a[c].toShapes());return b};\nTHREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;c<a.length;c++)a[c].update(b)},addToUpdate:function(b){a.indexOf(b)===-1&&a.push(b)},removeFromUpdate:function(b){b=a.indexOf(b);b!==-1&&a.splice(b,1)},add:function(a){b[a.name]!==void 0&&console.log(\"THREE.AnimationHandler.add: Warning! \"+a.name+\" already exists in library. Overwriting.\");b[a.name]=a;if(a.initialized!==true){for(var c=0;c<a.hierarchy.length;c++){for(var d=0;d<a.hierarchy[c].keys.length;d++){if(a.hierarchy[c].keys[d].time<\n0)a.hierarchy[c].keys[d].time=0;if(a.hierarchy[c].keys[d].rot!==void 0&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}}if(a.hierarchy[c].keys.length&&a.hierarchy[c].keys[0].morphTargets!==void 0){h={};for(d=0;d<a.hierarchy[c].keys.length;d++)for(var j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++){var l=a.hierarchy[c].keys[d].morphTargets[j];h[l]=-1}a.hierarchy[c].usedMorphTargets=\nh;for(d=0;d<a.hierarchy[c].keys.length;d++){var k={};for(l in h){for(j=0;j<a.hierarchy[c].keys[d].morphTargets.length;j++)if(a.hierarchy[c].keys[d].morphTargets[j]===l){k[l]=a.hierarchy[c].keys[d].morphTargetsInfluences[j];break}j===a.hierarchy[c].keys[d].morphTargets.length&&(k[l]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=k}}for(d=1;d<a.hierarchy[c].keys.length;d++)if(a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time){a.hierarchy[c].keys.splice(d,1);d--}for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=\nd}d=parseInt(a.length*a.fps,10);a.JIT={};a.JIT.hierarchy=[];for(c=0;c<a.hierarchy.length;c++)a.JIT.hierarchy.push(Array(d));a.initialized=true}},get:function(a){if(typeof a===\"string\"){if(b[a])return b[a];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+a);return null}},parse:function(a){var b=[];if(a instanceof THREE.SkinnedMesh)for(var c=0;c<a.bones.length;c++)b.push(a.bones[c]);else d(a,b);return b}},d=function(a,b){b.push(a);for(var c=0;c<a.children.length;c++)d(a.children[c],\nb)};c.LINEAR=0;c.CATMULLROM=1;c.CATMULLROM_FORWARD=2;return c}();THREE.Animation=function(a,b,c,d){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.loop=this.isPaused=true;this.interpolationType=c!==void 0?c:THREE.AnimationHandler.LINEAR;this.JITCompile=d!==void 0?d:true;this.points=[];this.target=new THREE.Vector3};\nTHREE.Animation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;var c,d=this.hierarchy.length,e;for(c=0;c<d;c++){e=this.hierarchy[c];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD)e.useQuaternion=true;e.matrixAutoUpdate=true;if(e.animationCache===void 0){e.animationCache={};e.animationCache.prevKey={pos:0,rot:0,scl:0};e.animationCache.nextKey={pos:0,rot:0,scl:0};e.animationCache.originalMatrix=\ne instanceof THREE.Bone?e.skinMatrix:e.matrix}var f=e.animationCache.prevKey;e=e.animationCache.nextKey;f.pos=this.data.hierarchy[c].keys[0];f.rot=this.data.hierarchy[c].keys[0];f.scl=this.data.hierarchy[c].keys[0];e.pos=this.getNextKeyWith(\"pos\",c,1);e.rot=this.getNextKeyWith(\"rot\",c,1);e.scl=this.getNextKeyWith(\"scl\",c,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};\nTHREE.Animation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.hierarchy.length;a++)if(this.hierarchy[a].animationCache!==void 0){this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix=this.hierarchy[a].animationCache.originalMatrix:this.hierarchy[a].matrix=this.hierarchy[a].animationCache.originalMatrix;delete this.hierarchy[a].animationCache}};\nTHREE.Animation.prototype.update=function(a){if(this.isPlaying){var b=[\"pos\",\"rot\",\"scl\"],c,d,e,f,g,h,j,l,k=this.data.JIT.hierarchy,p,m;m=this.currentTime=this.currentTime+a*this.timeScale;p=this.currentTime=this.currentTime%this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var o=0,q=this.hierarchy.length;o<q;o++){a=this.hierarchy[o];j=a.animationCache;if(this.JITCompile&&k[o][l]!==void 0)if(a instanceof THREE.Bone){a.skinMatrix=k[o][l];a.matrixAutoUpdate=\nfalse;a.matrixWorldNeedsUpdate=false}else{a.matrix=k[o][l];a.matrixAutoUpdate=false;a.matrixWorldNeedsUpdate=true}else{if(this.JITCompile)a instanceof THREE.Bone?a.skinMatrix=a.animationCache.originalMatrix:a.matrix=a.animationCache.originalMatrix;for(var n=0;n<3;n++){c=b[n];g=j.prevKey[c];h=j.nextKey[c];if(h.time<=m){if(p<m)if(this.loop){g=this.data.hierarchy[o].keys[0];for(h=this.getNextKeyWith(c,o,1);h.time<p;){g=h;h=this.getNextKeyWith(c,o,h.index+1)}}else{this.stop();return}else{do{g=h;h=this.getNextKeyWith(c,\no,h.index+1)}while(h.time<p)}j.prevKey[c]=g;j.nextKey[c]=h}a.matrixAutoUpdate=true;a.matrixWorldNeedsUpdate=true;d=(p-g.time)/(h.time-g.time);e=g[c];f=h[c];if(d<0||d>1){console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+d+\" on bone \"+o);d=d<0?0:1}if(c===\"pos\"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===\nTHREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith(\"pos\",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith(\"pos\",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x,\nthis.target.z);a.rotation.set(0,d,0)}}}else if(c===\"rot\")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c===\"scl\"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;o<this.hierarchy.length;o++)k[o][l]=this.hierarchy[o]instanceof THREE.Bone?this.hierarchy[o].skinMatrix.clone():this.hierarchy[o].matrix.clone()}}};\nTHREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,j,l;e=(a.length-1)*b;f=Math.floor(e);e=e-f;c[0]=f===0?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d};\nTHREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c>0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=\nfalse;this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a,b){if(!this.isPlaying){this.isPlaying=true;this.loop=a!==void 0?a:true;this.currentTime=b!==void 0?b:0;this.startTimeMs=b;this.startTime=1E7;this.endTime=-this.startTime;var c,d=this.hierarchy.length,e,f;for(c=0;c<d;c++){e=this.hierarchy[c];f=this.data.hierarchy[c];e.useQuaternion=true;if(f.animationCache===void 0){f.animationCache={};f.animationCache.prevKey=null;f.animationCache.nextKey=null;f.animationCache.originalMatrix=e instanceof THREE.Bone?\ne.skinMatrix:e.matrix}e=this.data.hierarchy[c].keys;if(e.length){f.animationCache.prevKey=e[0];f.animationCache.nextKey=e[1];this.startTime=Math.min(e[0].time,this.startTime);this.endTime=Math.max(e[e.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};\nTHREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=false;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(c.animationCache!==void 0){var d=c.animationCache.originalMatrix;if(b instanceof THREE.Bone){d.copy(b.skinMatrix);b.skinMatrix=d}else{d.copy(b.matrix);b.matrix=d}delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(this.isPlaying){var b,c,d,e,f=this.data.JIT.hierarchy,g,h,j;h=this.currentTime=this.currentTime+a*this.timeScale;g=this.currentTime=this.currentTime%this.data.length;if(g<this.startTimeMs)g=this.currentTime=this.startTimeMs+g;e=parseInt(Math.min(g*this.data.fps,this.data.length*this.data.fps),10);if((j=g<h)&&!this.loop){for(var a=0,l=this.hierarchy.length;a<l;a++){var k=this.data.hierarchy[a].keys,f=this.data.hierarchy[a].sids;d=k.length-1;e=\nthis.hierarchy[a];if(k.length){for(k=0;k<f.length;k++){g=f[k];(h=this.getPrevKeyWith(g,a,d))&&h.apply(g)}this.data.hierarchy[a].node.updateMatrix();e.matrixWorldNeedsUpdate=true}}this.stop()}else if(!(g<this.startTime)){a=0;for(l=this.hierarchy.length;a<l;a++){d=this.hierarchy[a];b=this.data.hierarchy[a];var k=b.keys,p=b.animationCache;if(this.JITCompile&&f[a][e]!==void 0)if(d instanceof THREE.Bone){d.skinMatrix=f[a][e];d.matrixWorldNeedsUpdate=false}else{d.matrix=f[a][e];d.matrixWorldNeedsUpdate=\ntrue}else if(k.length){if(this.JITCompile&&p)d instanceof THREE.Bone?d.skinMatrix=p.originalMatrix:d.matrix=p.originalMatrix;b=p.prevKey;c=p.nextKey;if(b&&c){if(c.time<=h){if(j&&this.loop){b=k[0];for(c=k[1];c.time<g;){b=c;c=k[b.index+1]}}else if(!j)for(var m=k.length-1;c.time<g&&c.index!==m;){b=c;c=k[b.index+1]}p.prevKey=b;p.nextKey=c}c.time>=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true);\nfor(a=0;a<this.hierarchy.length;a++)f[a][e]=this.hierarchy[a]instanceof THREE.Bone?this.hierarchy[a].skinMatrix.clone():this.hierarchy[a].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c%b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=c>=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;\nTHREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera;\nTHREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false};\nTHREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true};\nTHREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}};\nTHREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};\nTHREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=\nthis.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=\ntrue;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};\nthis.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight=\nfalse;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);\nthis.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*\nMath.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+\n100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",c(this,this.onMouseMove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.onMouseDown),false);this.domElement.addEventListener(\"mouseup\",c(this,this.onMouseUp),false);this.domElement.addEventListener(\"keydown\",c(this,this.onKeyDown),false);this.domElement.addEventListener(\"keyup\",\nc(this,this.onKeyUp),false)};\nTHREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f<r-1;f++){u=d*h.chunks[f]/h.total;b.keys[f]={time:u,pos:g[f]}}e.hierarchy[0]=b;THREE.AnimationHandler.add(e);\nreturn new THREE.Animation(a,c,THREE.AnimationHandler.CATMULLROM_FORWARD,false)}function f(a,b){var c,d,e=new THREE.Geometry;for(c=0;c<a.points.length*b;c++){d=c/(a.points.length*b);d=a.getPoint(d);e.vertices[c]=new THREE.Vector3(d.x,d.y,d.z)}return e}this.object=a;this.domElement=b!==void 0?b:document;this.id=\"PathControls\"+THREE.PathControlsIdCounter++;this.duration=1E4;this.waypoints=[];this.useConstantSpeed=true;this.resamplingCoef=50;this.debugPath=new THREE.Object3D;this.debugDummy=new THREE.Object3D;\nthis.animationParent=new THREE.Object3D;this.lookSpeed=0.005;this.lookHorizontal=this.lookVertical=true;this.verticalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.horizontalAngleMap={srcRange:[0,2*Math.PI],dstRange:[0,2*Math.PI]};this.target=new THREE.Object3D;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=0;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=\nthis.domElement.offsetHeight/2;this.domElement.setAttribute(\"tabindex\",-1)}var g=Math.PI*2,h=Math.PI/180;this.update=function(a){var b;if(this.lookHorizontal)this.lon=this.lon+this.mouseX*this.lookSpeed*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*this.lookSpeed*a;this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;a=this.phi%g;this.phi=a>=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange;\nb=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement===\ndocument){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}),\nc=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a=\nthis.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o<b.points.length;o++){c=new THREE.Mesh(g,h);c.position.copy(b.points[o]);a.add(c)}}this.domElement.addEventListener(\"mousemove\",d(this,\nthis.onMouseMove),false)}};THREE.PathControlsIdCounter=0;\nTHREE.FlyControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.domElement=b!==void 0?b:document;b&&this.domElement.setAttribute(\"tabindex\",-1);this.movementSpeed=1;this.rollSpeed=0.005;this.autoForward=this.dragToLook=false;this.object.useQuaternion=true;this.tmpQuaternion=new THREE.Quaternion;this.mouseStatus=0;this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0};this.moveVector=\nnew THREE.Vector3(0,0,0);this.rotationVector=new THREE.Vector3(0,0,0);this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.keydown=function(a){if(!a.altKey){switch(a.keyCode){case 16:this.movementSpeedMultiplier=0.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=\n1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector();this.updateRotationVector()}};this.keyup=function(a){switch(a.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=\n0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector();this.updateRotationVector()};this.mousedown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus++;else switch(a.button){case 0:this.object.moveForward=\ntrue;break;case 2:this.object.moveBackward=true}};this.mousemove=function(a){if(!this.dragToLook||this.mouseStatus>0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward=\nfalse;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion);\nthis.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=\n-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener(\"mousemove\",c(this,this.mousemove),false);this.domElement.addEventListener(\"mousedown\",c(this,this.mousedown),false);this.domElement.addEventListener(\"mouseup\",\nc(this,this.mouseup),false);this.domElement.addEventListener(\"keydown\",c(this,this.keydown),false);this.domElement.addEventListener(\"keyup\",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()};\nTHREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=\na*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}e.copy(this.forward);\nd.set(0,1,0);c.cross(d,e).normalize();d.cross(e,c).normalize();this.object.matrix.elements[0]=c.x;this.object.matrix.elements[4]=d.x;this.object.matrix.elements[8]=e.x;this.object.matrix.elements[1]=c.y;this.object.matrix.elements[5]=d.y;this.object.matrix.elements[9]=e.y;this.object.matrix.elements[2]=c.z;this.object.matrix.elements[6]=d.z;this.object.matrix.elements[10]=e.z;f.identity();f.elements[0]=Math.cos(this.roll);f.elements[4]=-Math.sin(this.roll);f.elements[1]=Math.sin(this.roll);f.elements[5]=\nMath.cos(this.roll);this.object.matrix.multiplySelf(f);this.object.matrixWorldNeedsUpdate=true;this.object.matrix.elements[12]=this.object.position.x;this.object.matrix.elements[13]=this.object.position.y;this.object.matrix.elements[14]=this.object.position.z};this.translateX=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[0]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[1]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[2]*\na};this.translateY=function(a){this.object.position.x=this.object.position.x+this.object.matrix.elements[4]*a;this.object.position.y=this.object.position.y+this.object.matrix.elements[5]*a;this.object.position.z=this.object.position.z+this.object.matrix.elements[6]*a};this.translateZ=function(a){this.object.position.x=this.object.position.x-this.object.matrix.elements[8]*a;this.object.position.y=this.object.position.y-this.object.matrix.elements[9]*a;this.object.position.z=this.object.position.z-\nthis.object.matrix.elements[10]*a};this.rotateHorizontally=function(a){c.set(this.object.matrix.elements[0],this.object.matrix.elements[1],this.object.matrix.elements[2]);c.multiplyScalar(a);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(a){d.set(this.object.matrix.elements[4],this.object.matrix.elements[5],this.object.matrix.elements[6]);d.multiplyScalar(a);this.forward.addSelf(d);this.forward.normalize()};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},\nfalse);this.domElement.addEventListener(\"mousemove\",function(a){p=(a.clientX-o)/window.innerWidth;m=(a.clientY-q)/window.innerHeight},false);this.domElement.addEventListener(\"mousedown\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=1;break;case 2:j=-1}},false);this.domElement.addEventListener(\"mouseup\",function(a){a.preventDefault();a.stopPropagation();switch(a.button){case 0:j=0;break;case 2:j=0}},false);this.domElement.addEventListener(\"keydown\",function(a){switch(a.keyCode){case 38:case 87:j=\n1;break;case 37:case 65:l=-1;break;case 40:case 83:j=-1;break;case 39:case 68:l=1;break;case 81:g=true;h=1;break;case 69:g=true;h=-1;break;case 82:k=1;break;case 70:k=-1}},false);this.domElement.addEventListener(\"keyup\",function(a){switch(a.keyCode){case 38:case 87:j=0;break;case 37:case 65:l=0;break;case 40:case 83:j=0;break;case 39:case 68:l=0;break;case 81:g=false;break;case 69:g=false;break;case 82:k=0;break;case 70:k=0}},false)};\nTHREE.TrackballControls=function(a,b){THREE.EventTarget.call(this);var c=this;this.object=a;this.domElement=b!==void 0?b:document;this.enabled=true;this.screen={width:window.innerWidth,height:window.innerHeight,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=0.3;this.staticMoving=this.noPan=this.noZoom=this.noRotate=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];\nthis.target=new THREE.Vector3;var d=new THREE.Vector3,e=false,f=-1,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector2,k=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,o={type:\"change\"};this.handleEvent=function(a){if(typeof this[a.type]==\"function\")this[a.type](a)};this.getMouseOnScreen=function(a,b){return new THREE.Vector2((a-c.screen.offsetLeft)/c.radius*0.5,(b-c.screen.offsetTop)/c.radius*0.5)};this.getMouseProjectionOnBall=function(a,b){var d=new THREE.Vector3((a-\nc.screen.width*0.5-c.screen.offsetLeft)/c.radius,(c.screen.height*0.5+c.screen.offsetTop-b)/c.radius,0),e=d.length();e>1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed;\nd.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x);\nb.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLength(c.minDistance))}};this.update=function(){g.copy(c.object.position).subSelf(c.target);\nc.noRotate||c.rotateCamera();c.noZoom||c.zoomCamera();c.noPan||c.panCamera();c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target);if(d.distanceTo(c.object.position)>0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener(\"contextmenu\",function(a){a.preventDefault()},false);this.domElement.addEventListener(\"mousemove\",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p=\nm=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener(\"mousedown\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX,\na.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener(\"mouseup\",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener(\"keydown\",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener(\"keyup\",function(){c.enabled&&f!==-1&&(f=-1)},false)};\nTHREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a===\"x\"&&b===\"y\"||a===\"y\"&&b===\"x\")n=\"z\";else if(a===\"x\"&&b===\"z\"||a===\"z\"&&b===\"x\"){n=\"y\";o=f||1}else if(a===\"z\"&&b===\"y\"||a===\"y\"&&b===\"z\"){n=\"x\";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h<u;h++)for(j=0;j<i;j++){var F=new THREE.Vector3;F[a]=(j*y-q)*c;F[b]=(h*C-r)*g;F[n]=k;l.vertices.push(F)}for(h=0;h<o;h++)for(j=0;j<p;j++){a=new THREE.Face4(j+\ni*h+t,j+i*(h+1)+t,j+1+i*(h+1)+t,j+1+i*h+t);a.normal.copy(Y);a.vertexNormals.push(Y.clone(),Y.clone(),Y.clone(),Y.clone());a.materialIndex=m;l.faces.push(a);l.faceVertexUvs[0].push([new THREE.UV(j/p,h/o),new THREE.UV(j/p,(h+1)/o),new THREE.UV((j+1)/p,(h+1)/o),new THREE.UV((j+1)/p,h/o)])}}THREE.Geometry.call(this);var l=this,k=a/2,p=b/2,m=c/2,o,q,n,r,u,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(o=0;o<6;o++)this.materials.push(g)}o=0;r=1;q=2;u=3;n=4;t=5}else this.materials=\n[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var y in h)this.sides[y]!==void 0&&(this.sides[y]=h[y]);this.sides.px&&j(\"z\",\"y\",-1,-1,c,b,k,o);this.sides.nx&&j(\"z\",\"y\",1,-1,c,b,-k,r);this.sides.py&&j(\"x\",\"z\",1,1,a,c,p,q);this.sides.ny&&j(\"x\",\"z\",1,-1,a,c,-p,u);this.sides.pz&&j(\"x\",\"y\",1,-1,a,b,m,n);this.sides.nz&&j(\"x\",\"y\",-1,-1,a,b,-m,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;\nTHREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,e=e||1,h,j,l=[],k=[];for(j=0;j<=e;j++){var p=[],m=[],o=j/e,q=o*(b-a)+a;for(h=0;h<=d;h++){var n=h/d,r=new THREE.Vector3;r.x=q*Math.sin(n*Math.PI*2);r.y=-o*c+g;r.z=q*Math.cos(n*Math.PI*2);this.vertices.push(r);p.push(this.vertices.length-1);m.push(new THREE.UV(n,o))}l.push(p);k.push(m)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){p=this.vertices[l[0][h]].clone();m=this.vertices[l[0][h+\n1]].clone()}else{p=this.vertices[l[1][h]].clone();m=this.vertices[l[1][h+1]].clone()}p.setY(Math.sqrt(p.x*p.x+p.z*p.z)*c).normalize();m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();for(j=0;j<e;j++){var o=l[j][h],q=l[j+1][h],n=l[j+1][h+1],r=l[j][h+1],u=p.clone(),t=p.clone(),y=m.clone(),s=m.clone(),w=k[j][h].clone(),H=k[j+1][h].clone(),E=k[j+1][h+1].clone(),z=k[j][h+1].clone();this.faces.push(new THREE.Face4(o,q,n,r,[u,t,y,s]));this.faceVertexUvs[0].push([w,H,E,z])}}if(!f&&a>0){this.vertices.push(new THREE.Vector3(0,\ng,0));for(h=0;h<d;h++){o=l[0][h];q=l[0][h+1];n=this.vertices.length-1;u=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);y=new THREE.Vector3(0,1,0);w=k[0][h].clone();H=k[0][h+1].clone();E=new THREE.UV(H.u,0);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}if(!f&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){o=l[j][h+1];q=l[j][h];n=this.vertices.length-1;u=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,-1,0);y=new THREE.Vector3(0,-1,0);\nw=k[j][h+1].clone();H=k[j][h].clone();E=new THREE.UV(H.u,1);this.faces.push(new THREE.Face3(o,q,n,[u,t,y]));this.faceVertexUvs[0].push([w,H,E])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=new THREE.Geometry;THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;\nTHREE.ExtrudeGeometry=function(a,b){if(typeof a!==\"undefined\"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=new THREE.Geometry;THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();\nh.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log(\"Either infinite or no solutions!\");g===0?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f=\nc.length-1);for(var g=0,h=m+k*2,g=0;g<h;g++){var i=U*g,j=U*(g+1),l=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,p=c,o=g,q=h,l=l+J,i=i+J,n=n+J,j=j+J;A.faces.push(new THREE.Face4(l,i,n,j,null,null,t));l=O.generateSideWallUV(A,a,p,b,l,i,n,j,o,q);A.faceVertexUvs[0].push(l)}}}function f(a,b,c){A.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+J;d=d+J;e=e+J;A.faces.push(new THREE.Face3(c,d,e,null,null,u));c=f?O.generateBottomUV(A,a,b,c,d,e):O.generateTopUV(A,a,b,c,d,e);A.faceVertexUvs[0].push(c)}var h=\nb.amount!==void 0?b.amount:100,j=b.bevelThickness!==void 0?b.bevelThickness:6,l=b.bevelSize!==void 0?b.bevelSize:j-2,k=b.bevelSegments!==void 0?b.bevelSegments:3,p=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,o=b.bendPath,q=b.extrudePath,n,r=false,u=b.material,t=b.extrudeMaterial,y,s,w,H;if(q){n=q.getSpacedPoints(m);r=true;p=false;y=new THREE.TubeGeometry.FrenetFrames(q,m,false);s=new THREE.Vector3;w=new THREE.Vector3;H=new THREE.Vector3}if(!p)l=j=k=0;var E,z,v,A=this,\nJ=this.vertices.length;o&&a.addWrapPath(o);var q=a.extractPoints(),o=q.shape,K=q.holes;if(q=!THREE.Shape.Utils.isClockWise(o)){o=o.reverse();z=0;for(v=K.length;z<v;z++){E=K[z];THREE.Shape.Utils.isClockWise(E)&&(K[z]=E.reverse())}q=false}var R=THREE.Shape.Utils.triangulateShape(o,K),P=o;z=0;for(v=K.length;z<v;z++){E=K[z];o=o.concat(E)}var D,M,G,i,T,U=o.length,C,Y=R.length,q=[],F=0;G=P.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);q[F]=d(P[F],P[D],P[M])}var ea=[],fa,ia=q.concat();\nz=0;for(v=K.length;z<v;z++){E=K[z];fa=[];F=0;G=E.length;D=G-1;for(M=F+1;F<G;F++,D++,M++){D===G&&(D=0);M===G&&(M=0);fa[F]=d(E[F],E[D],E[M])}ea.push(fa);ia=ia.concat(fa)}for(D=0;D<k;D++){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,-i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);f(T.x,T.y,-i)}}}M=l;for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[0]).multiplyScalar(T.x);s.copy(y.binormals[0]).multiplyScalar(T.y);\nH.copy(n[0]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,0)}for(G=1;G<=m;G++)for(F=0;F<U;F++){T=p?c(o[F],ia[F],M):o[F];if(r){w.copy(y.normals[G]).multiplyScalar(T.x);s.copy(y.binormals[G]).multiplyScalar(T.y);H.copy(n[G]).addSelf(w).addSelf(s);f(H.x,H.y,H.z)}else f(T.x,T.y,h/m*G)}for(D=k-1;D>=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F<G;F++){T=c(P[F],q[F],M);f(T.x,T.y,h+i)}z=0;for(v=K.length;z<v;z++){E=K[z];fa=ea[z];F=0;for(G=E.length;F<G;F++){T=c(E[F],fa[F],M);\nr?f(T.x,T.y+n[m-1].y,n[m-1].x+i):f(T.x,T.y,h+i)}}}var O=THREE.ExtrudeGeometry.WorldUVGenerator;(function(){if(p){var a;a=U*0;for(F=0;F<Y;F++){C=R[F];g(C[2]+a,C[1]+a,C[0]+a,true)}a=m+k*2;a=U*a;for(F=0;F<Y;F++){C=R[F];g(C[0]+a,C[1]+a,C[2]+a,false)}}else{for(F=0;F<Y;F++){C=R[F];g(C[2],C[1],C[0],true)}for(F=0;F<Y;F++){C=R[F];g(C[0]+U*m,C[1]+U*m,C[2]+U*m,false)}}})();(function(){var a=0;e(P,a);a=a+P.length;z=0;for(v=K.length;z<v;z++){E=K[z];e(E,a);a=a+E.length}})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,j=a.vertices[f].y,f=a.vertices[f].z,l=a.vertices[g].x,k=\na.vertices[g].y,g=a.vertices[g].z,p=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-j)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(l,g),new THREE.UV(p,a)]:[new THREE.UV(c,e),new THREE.UV(j,f),new THREE.UV(k,g),new THREE.UV(m,a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v6=new THREE.Vector2;\nTHREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=c||2*Math.PI,d=[],e=(new THREE.Matrix4).makeRotationZ(c/b),f=0;f<a.length;f++){d[f]=a[f].clone();this.vertices.push(d[f])}for(var g=b+1,c=0;c<g;c++)for(f=0;f<d.length;f++){d[f]=e.multiplyVector3(d[f].clone());this.vertices.push(d[f])}for(c=0;c<b;c++){d=0;for(e=a.length;d<e-1;d++){this.faces.push(new THREE.Face4(c*e+d,(c+1)%g*e+d,(c+1)%g*e+(d+1)%e,c*e+(d+1)%e));this.faceVertexUvs[0].push([new THREE.UV(1-c/b,d/e),new THREE.UV(1-\n(c+1)/b,d/e),new THREE.UV(1-(c+1)/b,(d+1)/e),new THREE.UV(1-c/b,(d+1)/e)])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=new THREE.Geometry;THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var e=a/2,f=b/2,c=c||1,d=d||1,g=c+1,h=d+1,j=a/c,l=b/d,k=new THREE.Vector3(0,1,0),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*j-e,0,a*l-f));for(a=0;a<d;a++)for(b=0;b<c;b++){e=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);e.normal.copy(k);e.vertexNormals.push(k.clone(),k.clone(),k.clone(),k.clone());this.faces.push(e);this.faceVertexUvs[0].push([new THREE.UV(b/c,a/d),new THREE.UV(b/c,(a+1)/d),new THREE.UV((b+\n1)/c,(a+1)/d),new THREE.UV((b+1)/c,a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=new THREE.Geometry;THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,e=e!==void 0?e:Math.PI*2,f=f!==void 0?f:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,j,l=[],k=[];for(j=0;j<=c;j++){var p=[],m=[];for(h=0;h<=b;h++){var o=h/b,q=j/c,n=new THREE.Vector3;n.x=-a*Math.cos(d+o*e)*Math.sin(f+q*g);n.y=a*Math.cos(f+q*g);n.z=a*Math.sin(d+o*e)*Math.sin(f+q*g);this.vertices.push(n);p.push(this.vertices.length-1);m.push(new THREE.UV(o,\nq))}l.push(p);k.push(m)}for(j=0;j<c;j++)for(h=0;h<b;h++){var d=l[j][h+1],e=l[j][h],f=l[j+1][h],g=l[j+1][h+1],p=this.vertices[d].clone().normalize(),m=this.vertices[e].clone().normalize(),o=this.vertices[f].clone().normalize(),q=this.vertices[g].clone().normalize(),n=k[j][h+1].clone(),r=k[j][h].clone(),u=k[j+1][h].clone(),t=k[j+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,f,g,[p,o,q]));this.faceVertexUvs[0].push([n,u,t])}else if(Math.abs(this.vertices[f].y)==\na){this.faces.push(new THREE.Face3(d,e,f,[p,m,o]));this.faceVertexUvs[0].push([n,r,u])}else{this.faces.push(new THREE.Face4(d,e,f,g,[p,m,o,q]));this.faceVertexUvs[0].push([n,r,u,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry;THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;\nTHREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry;\nTHREE.TextGeometry.prototype.constructor=THREE.TextGeometry;\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=\n0,e=(\"\"+a).split(\"\"),f=e.length,g=[],a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,j,l,k,p,m,o,q,n,r,u=b.glyphs[a]||b.glyphs[\"?\"];if(u){if(u.o){b=u._cachedOutline||(u._cachedOutline=u.o.split(\" \"));l=b.length;for(a=0;a<l;){j=b[a++];switch(j){case \"m\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,k));e.moveTo(j,k);break;case \"l\":j=b[a++]*c+d;k=b[a++]*c;f.push(new THREE.Vector2(j,\nk));e.lineTo(j,k);break;case \"q\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(o,q,j,k);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h,y=THREE.Shape.Utils.b2(t,p,o,j),t=THREE.Shape.Utils.b2(t,m,q,k);f.push(new THREE.Vector2(y,t))}}break;case \"b\":j=b[a++]*c+d;k=b[a++]*c;o=b[a++]*c+d;q=b[a++]*-c;n=b[a++]*c+d;r=b[a++]*-c;e.bezierCurveTo(j,k,o,q,n,r);if(g=f[f.length-1]){p=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;y=THREE.Shape.Utils.b3(t,p,o,\nn,j);t=THREE.Shape.Utils.b3(t,m,q,r,k);f.push(new THREE.Vector2(y,t))}}}}}return{offset:u.ha*c,points:f,path:e}}}};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],j,l,k;if(b(a)>0)for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var p=2*e;for(l=e-1;e>2;){if(p--<=0){console.log(\"Warning, unable to triangulate polygon!\");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0,\nE=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t<r;t++)if(!(t==o||t==q||t==n)){var v=m[u[t]].x,A=m[u[t]].y,J=void 0,K=void 0,R=void 0,P=void 0,D=void 0,M=void 0,G=void 0,i=void 0,T=void 0,U=void 0,C=void 0,Y=void 0,J=R=D=void 0,J=E-w,K=z-H,R=y-E,P=s-z,D=w-y,M=H-s,G=v-y,i=A-s,T=v-w,U=A-H,C=v-E,Y=A-z,J=J*U-K*T,D=D*i-M*G,R=R*Y-P*C;if(J>=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]],\na[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k<e;j++,k++)g[j]=g[k];e--;p=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=e||Math.PI*2;e=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var f=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;e.x=this.radius*Math.cos(f);e.y=this.radius*Math.sin(f);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(f);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(f);h.z=\nthis.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,1-c/this.segmentsR));b.push(h.clone().subSelf(e).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var e=(this.segmentsT+1)*c+d-1,f=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,j=new THREE.Face4(e,f,g,h,[b[e],b[f],b[g],b[h]]);j.normal.addSelf(b[e]);j.normal.addSelf(b[f]);j.normal.addSelf(b[g]);j.normal.addSelf(b[h]);j.normal.normalize();this.faces.push(j);\nthis.faceVertexUvs[0].push([a[e].clone(),a[f].clone(),a[g].clone(),a[h].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=new THREE.Geometry;THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e,f){var g=Math.cos(a);Math.cos(b);b=Math.sin(a);a=c/d*a;c=Math.cos(a);g=e*(2+c)*0.5*g;b=e*(2+c)*b*0.5;e=f*e*Math.sin(a)*0.5;return new THREE.Vector3(g,b,e)}THREE.Geometry.call(this);this.radius=a||200;this.tube=b||40;this.segmentsR=c||64;this.segmentsT=d||8;this.p=e||2;this.q=f||3;this.heightScale=g||1;this.grid=Array(this.segmentsR);c=new THREE.Vector3;d=new THREE.Vector3;e=new THREE.Vector3;for(a=0;a<this.segmentsR;++a){this.grid[a]=\nArray(this.segmentsT);for(b=0;b<this.segmentsT;++b){var j=a/this.segmentsR*2*this.p*Math.PI,g=b/this.segmentsT*2*Math.PI,f=h(j,g,this.q,this.p,this.radius,this.heightScale),j=h(j+0.01,g,this.q,this.p,this.radius,this.heightScale);c.sub(j,f);d.add(j,f);e.cross(c,d);d.cross(e,c);e.normalize();d.normalize();j=-this.tube*Math.cos(g);g=this.tube*Math.sin(g);f.x=f.x+(j*d.x+g*e.x);f.y=f.y+(j*d.y+g*e.y);f.z=f.z+(j*d.z+g*e.z);this.grid[a][b]=this.vertices.push(new THREE.Vector3(f.x,f.y,f.z))-1}}for(a=0;a<\nthis.segmentsR;++a)for(b=0;b<this.segmentsT;++b){var e=(a+1)%this.segmentsR,f=(b+1)%this.segmentsT,c=this.grid[a][b],d=this.grid[e][b],e=this.grid[e][f],f=this.grid[a][f],g=new THREE.UV(a/this.segmentsR,b/this.segmentsT),j=new THREE.UV((a+1)/this.segmentsR,b/this.segmentsT),l=new THREE.UV((a+1)/this.segmentsR,(b+1)/this.segmentsT),k=new THREE.UV(a/this.segmentsR,(b+1)/this.segmentsT);this.faces.push(new THREE.Face4(c,d,e,f));this.faceVertexUvs[0].push([g,j,l,k])}this.computeCentroids();this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=new THREE.Geometry;THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;\nTHREE.TubeGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.path=a;this.segments=b||64;this.radius=c||1;this.segmentsRadius=d||8;this.closed=e||false;if(f)this.debug=new THREE.Object3D;this.grid=[];var g,h,f=this.segments+1,j,l,k,p=new THREE.Vector3,m,o,q,b=new THREE.TubeGeometry.FrenetFrames(a,b,e);m=b.tangents;o=b.normals;q=b.binormals;this.tangents=m;this.normals=o;this.binormals=q;for(b=0;b<f;b++){this.grid[b]=[];d=b/(f-1);k=a.getPointAt(d);d=m[b];g=o[b];h=q[b];if(this.debug){this.debug.add(new THREE.ArrowHelper(d,\nk,c,255));this.debug.add(new THREE.ArrowHelper(g,k,c,16711680));this.debug.add(new THREE.ArrowHelper(h,k,c,65280))}for(d=0;d<this.segmentsRadius;d++){j=d/this.segmentsRadius*2*Math.PI;l=-this.radius*Math.cos(j);j=this.radius*Math.sin(j);p.copy(k);p.x=p.x+(l*g.x+j*h.x);p.y=p.y+(l*g.y+j*h.y);p.z=p.z+(l*g.z+j*h.z);this.grid[b][d]=this.vertices.push(new THREE.Vector3(p.x,p.y,p.z))-1}}for(b=0;b<this.segments;b++)for(d=0;d<this.segmentsRadius;d++){f=e?(b+1)%this.segments:b+1;p=(d+1)%this.segmentsRadius;\na=this.grid[b][d];c=this.grid[f][d];f=this.grid[f][p];p=this.grid[b][p];m=new THREE.UV(b/this.segments,d/this.segmentsRadius);o=new THREE.UV((b+1)/this.segments,d/this.segmentsRadius);q=new THREE.UV((b+1)/this.segments,(d+1)/this.segmentsRadius);g=new THREE.UV(b/this.segments,(d+1)/this.segmentsRadius);this.faces.push(new THREE.Face4(a,c,f,p));this.faceVertexUvs[0].push([m,o,q,g])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=new THREE.Geometry;\nTHREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,j=new THREE.Matrix4,b=b+1,l,k,p;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++){k=l/(b-1);e[l]=a.getTangentAt(k);e[l].normalize()}f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);k=Math.abs(e[0].y);p=Math.abs(e[0].z);if(l<=a){a=l;d.set(1,0,0)}if(k<=a){a=k;d.set(0,1,0)}p<=a&&d.set(0,0,1);h.cross(e[0],d).normalize();\nf[0].cross(e[0],h);g[0].cross(e[0],f[0]);for(l=1;l<b;l++){f[l]=f[l-1].clone();g[l]=g[l-1].clone();h.cross(e[l-1],e[l]);if(h.length()>1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l<b;l++){j.makeRotationAxis(e[l],d*l).multiplyVector3(f[l]);g[l].cross(e[l],f[l])}}};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=j.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+0.5,a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+0.5;b.uv=new THREE.UV(c,a);return b}function f(a,b,c,d){if(d<1){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);d.normal=d.centroid.clone().normalize();j.faces.push(d);d=Math.atan2(d.centroid.z,-d.centroid.x);\nj.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}else{d=d-1;f(a,g(a,b),g(a,c),d);f(g(a,b),b,g(b,c),d);f(g(a,c),g(b,c),c,d);f(g(a,b),g(b,c),g(a,c),d)}}function g(a,b){p[a.index]||(p[a.index]=[]);p[b.index]||(p[b.index]=[]);var c=p[a.index][b.index];c===void 0&&(p[a.index][b.index]=p[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){c<0&&a.u===1&&(a=new THREE.UV(a.u-1,a.v));b.x===0&&b.z===0&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this);\nfor(var c=c||1,d=d||0,j=this,l=0,k=a.length;l<k;l++)e(new THREE.Vector3(a[l][0],a[l][1],a[l][2]));for(var p=[],a=this.vertices,l=0,k=b.length;l<k;l++)f(a[b[l][0]],a[b[l][1]],a[b[l][2]],d);this.mergeVertices();l=0;for(k=this.vertices.length;l<k;l++)this.vertices[l].multiplyScalar(c);this.computeCentroids();this.boundingSphere={radius:c}};THREE.PolyhedronGeometry.prototype=new THREE.Geometry;THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;\nTHREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,c,0],[1,c,0],[-1,-c,0],[1,-c,0],[0,-1,c],[0,1,c],[0,-1,-c],[0,1,-c],[c,0,-1],[c,0,1],[-c,0,-1],[-c,0,1]],[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]],a,b)};THREE.IcosahedronGeometry.prototype=new THREE.Geometry;THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;\nTHREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],a,b)};THREE.OctahedronGeometry.prototype=new THREE.Geometry;THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],a,b)};\nTHREE.TetrahedronGeometry.prototype=new THREE.Geometry;THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;\nTHREE.ParametricGeometry=function(a,b,c,d){THREE.Geometry.call(this);var e=this.vertices,f=this.faces,g=this.faceVertexUvs[0],d=d===void 0?false:d,h,j,l,k,p=b+1;for(h=0;h<=c;h++){k=h/c;for(j=0;j<=b;j++){l=j/b;l=a(l,k);e.push(l)}}var m,o,q,n;for(h=0;h<c;h++)for(j=0;j<b;j++){a=h*p+j;e=h*p+j+1;k=(h+1)*p+j;l=(h+1)*p+j+1;m=new THREE.UV(h/b,j/c);o=new THREE.UV(h/b,(j+1)/c);q=new THREE.UV((h+1)/b,j/c);n=new THREE.UV((h+1)/b,(j+1)/c);if(d){f.push(new THREE.Face3(a,e,k));f.push(new THREE.Face3(e,l,k));g.push([m,\no,q]);g.push([o,n,q])}else{f.push(new THREE.Face4(a,e,l,k));g.push([m,o,q,n])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=new THREE.Geometry;THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;\nTHREE.AxisHelper=function(){THREE.Object3D.call(this);var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3);a.vertices.push(new THREE.Vector3(0,100,0));var b=new THREE.CylinderGeometry(0,5,25,5,1),c;c=new THREE.Line(a,new THREE.LineBasicMaterial({color:16711680}));c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:16711680}));c.position.x=100;c.rotation.z=-Math.PI/2;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:65280}));this.add(c);\nc=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:65280}));c.position.y=100;this.add(c);c=new THREE.Line(a,new THREE.LineBasicMaterial({color:255}));c.rotation.x=Math.PI/2;this.add(c);c=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:255}));c.position.z=100;c.rotation.x=Math.PI/2;this.add(c)};THREE.AxisHelper.prototype=new THREE.Object3D;THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;\nTHREE.ArrowHelper=function(a,b,c,d){THREE.Object3D.call(this);d===void 0&&(d=16776960);c===void 0&&(c=20);var e=new THREE.Geometry;e.vertices.push(new THREE.Vector3(0,0,0));e.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(e,new THREE.LineBasicMaterial({color:d}));this.add(this.line);e=new THREE.CylinderGeometry(0,0.05,0.25,5,1);this.cone=new THREE.Mesh(e,new THREE.MeshBasicMaterial({color:d}));this.cone.position.set(0,1,0);this.add(this.cone);if(b instanceof THREE.Vector3)this.position=\nb;this.setDirection(a);this.setLength(c)};THREE.ArrowHelper.prototype=new THREE.Object3D;THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(a){var b=(new THREE.Vector3(0,1,0)).crossSelf(a),a=Math.acos((new THREE.Vector3(0,1,0)).dot(a.clone().normalize()));this.matrix=(new THREE.Matrix4).makeRotationAxis(b.normalize(),a);this.rotation.getRotationFromMatrix(this.matrix,this.scale)};\nTHREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\n\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);b(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);this.camera=a;this.update(a);\nthis.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;\nTHREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(a!==void 0){d=0;for(e=a.length;d<e;d++)b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)}}var b=this;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,\n1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",0.7,1.1,-1);a(\"u2\",-0.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);this.lineGeometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;\nTHREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};\nTHREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r<o.length;r++){n=g.vertexColors[o[r]-1];l.r=l.r+n.r;l.g=l.g+n.g;l.b=l.b+n.b}l.r=l.r/o.length;l.g=l.g/o.length;l.b=l.b/o.length;\nj.vertexColors[q]=l}}k.push(j);if(m.supportUVs){g=[f(a,\"\"),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?p.push(g):b(\"d :( \",e+\":\"+i):b(\"c :( \",d+\":\"+i):b(\"b :( \",c+\":\"+i):b(\"a :( \",a+\":\"+i)}}function e(a,b){return Math.min(a,b)+\"_\"+Math.max(a,b)}function f(a,d){var e=a+\":\"+d,f=t[e];if(!f){a>=y&&a<y+q.length?b(\"face pt\"):b(\"edge pt\");c(\"warning, UV not found for\",e);return null}return f}function g(a,b,d){var e=a+\":\"+b;e in t?c(\"dup vertexNo\",a,\"oldFaceNo\",b,\"value\",d,\"key\",e,t[e]):t[e]=d}function h(a,\nb){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function j(a,b,c){P[a]===void 0&&(P[a]={});P[a][b]=c}var l=[],k=[],p=[],m=this,o=a.vertices,q=a.faces,l=o.concat(),n=[],r={},u={},t={},y=o.length,s,w,H,E,z,v=a.faceVertexUvs[0],A;b(\"originalFaces, uvs, originalVerticesLength\",q.length,v.length,y);if(m.supportUVs){s=0;for(w=v.length;s<w;s++){H=0;for(E=v[s].length;H<E;H++){A=q[s][\"abcd\".charAt(H)];g(A,s,v[s][H])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in t)s++;if(!s){m.supportUVs=false;b(\"no uvs\")}b(\"-- Original Faces + Vertices UVs completed\",\nt,\"vs\",v.length);s=0;for(w=q.length;s<w;s++){z=q[s];n.push(z.centroid);l.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(y+s,\"\",v)}}b(\"-- added UVs for new Faces\",t);w=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}\nvar c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);A=0;var J,K,R={},P={};for(s in w){v=w[s];J=s.split(\"_\");K=J[0];J=J[1];h(K,[K,J]);h(J,[K,J]);H=0;for(E=v.length;H<E;H++){z=v[H];j(K,z,s);j(J,z,s)}v.length<2&&(u[s]=true)}b(\"vertexEdgeMap\",R,\"vertexFaceMap\",P);for(s in w){v=\nw[s];z=v[0];E=v[1];J=s.split(\"_\");K=J[0];J=J[1];v=new THREE.Vector3;if(u[s]){v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[E]);v.addSelf(o[K]);v.addSelf(o[J]);v.multiplyScalar(0.25)}r[s]=y+q.length+A;l.push(v);A++;if(m.supportUVs){v=new THREE.UV;v.u=f(K,z).u+f(J,z).u;v.v=f(K,z).v+f(J,z).v;v.u=v.u/2;v.v=v.v/2;g(r[s],z,v);if(!u[s]){v=new THREE.UV;v.u=f(K,E).u+f(J,E).u;v.v=f(K,E).v+f(J,E).v;v.u=v.u/2;v.v=v.v/2;g(r[s],E,v)}}}b(\"-- Step 2 done\");var D,M;E=[\"123\",\n\"12\",\"2\",\"23\"];J=[\"123\",\"23\",\"3\",\"31\"];var G=[\"123\",\"31\",\"1\",\"12\"],i=[\"1234\",\"12\",\"2\",\"23\"],T=[\"1234\",\"23\",\"3\",\"34\"],U=[\"1234\",\"34\",\"4\",\"41\"],C=[\"1234\",\"41\",\"1\",\"12\"];s=0;for(w=n.length;s<w;s++){z=q[s];v=y+s;if(z instanceof THREE.Face3){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.a);d(v,r[A],z.b,r[K],z,E,s);d(v,r[K],z.c,r[D],z,J,s);d(v,r[D],z.a,r[A],z,G,s)}else if(z instanceof THREE.Face4){A=e(z.a,z.b);K=e(z.b,z.c);D=e(z.c,z.d);M=e(z.d,z.a);d(v,r[A],z.b,r[K],z,i,s);d(v,r[K],z.c,r[D],z,T,s);d(v,r[D],z.d,r[M],\nz,U,s);d(v,r[M],z.a,r[A],z,C,s)}else b(\"face should be a face!\",z)}r=new THREE.Vector3;z=new THREE.Vector3;s=0;for(w=o.length;s<w;s++)if(R[s]!==void 0){r.set(0,0,0);z.set(0,0,0);K=new THREE.Vector3(0,0,0);v=0;for(H in P[s]){r.addSelf(n[H]);v++}E=0;A=R[s].length;for(H=0;H<A;H++)u[e(R[s][H][0],R[s][H][1])]&&E++;if(E!=2){r.divideScalar(v);for(H=0;H<A;H++){v=R[s][H];v=o[v[0]].clone().addSelf(o[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(A);K.addSelf(o[s]);K.multiplyScalar(A-3);K.addSelf(r);K.addSelf(z.multiplyScalar(2));\nK.divideScalar(A);l[s]=K}}a.vertices=l;a.faces=k;a.faceVertexUvs[0]=p;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;\nTHREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype;\nTHREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,e=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+e*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=new THREE.Mesh;THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:false,time:0,direction:1,weight:1,directionBackwards:false,mirroredLoop:false};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&h.length>1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(f<h.start)h.start=f;if(f>h.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time=d.time+d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/\ne),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=\n0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);\nb.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,\"position\");p.uv=b.getAttribLocation(k,\"uv\");m.renderType=b.getUniformLocation(k,\"renderType\");m.map=b.getUniformLocation(k,\"map\");m.occlusionMap=b.getUniformLocation(k,\"occlusionMap\");m.opacity=b.getUniformLocation(k,\"opacity\");m.color=b.getUniformLocation(k,\n\"color\");m.scale=b.getUniformLocation(k,\"scale\");m.rotation=b.getUniformLocation(k,\"rotation\");m.screenPosition=b.getUniformLocation(k,\"screenPosition\");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,\n1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K<t;K++){E=16/u;z.set(E*s,E);D=a[K];y.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(y);d.projectionMatrix.multiplyVector3(y);v.copy(y);A.x=v.x*w+w;A.y=v.y*H+H;if(l||A.x>0&&A.x<e&&A.y>0&&\nA.y<u){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,0);b.uniform2f(J.scale,z.x,z.y);b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,j);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,A.x-8,A.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);\nb.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);D.positionScreen.copy(v);D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);R=0;for(P=D.lensFlares.length;R<P;R++){M=D.lensFlares[R];if(M.opacity>0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity);\nb.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;k<p;k++){m=j.__lights[k];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(q=0;q<m.shadowCascadeCount;q++){var s;if(m.shadowCascadeArray[q])s=m.shadowCascadeArray[q];\nelse{t=m;r=q;s=new THREE.DirectionalLight;s.isVirtual=true;s.onlyShadow=true;s.castShadow=true;s.shadowCameraNear=t.shadowCameraNear;s.shadowCameraFar=t.shadowCameraFar;s.shadowCameraLeft=t.shadowCameraLeft;s.shadowCameraRight=t.shadowCameraRight;s.shadowCameraBottom=t.shadowCameraBottom;s.shadowCameraTop=t.shadowCameraTop;s.shadowCameraVisible=t.shadowCameraVisible;s.shadowDarkness=t.shadowDarkness;s.shadowBias=t.shadowCascadeBias[r];s.shadowMapWidth=t.shadowCascadeWidth[r];s.shadowMapHeight=t.shadowCascadeHeight[r];\ns.pointsWorld=[];s.pointsFrustum=[];u=s.pointsWorld;n=s.pointsFrustum;for(var w=0;w<8;w++){u[w]=new THREE.Vector3;n[w]=new THREE.Vector3}u=t.shadowCascadeNearZ[r];t=t.shadowCascadeFarZ[r];n[0].set(-1,-1,u);n[1].set(1,-1,u);n[2].set(-1,1,u);n[3].set(1,1,u);n[4].set(-1,-1,t);n[5].set(1,-1,t);n[6].set(-1,1,t);n[7].set(1,1,t);s.originalCamera=l;n=new THREE.Gyroscope;n.position=m.shadowCascadeOffset;n.add(s);n.add(s.target);l.add(n);m.shadowCascadeArray[q]=s;console.log(\"Created virtualLight\",s)}r=m;u=\nq;t=r.shadowCascadeArray[u];t.position.copy(r.position);t.target.position.copy(r.target.position);t.lookAt(t.target);t.shadowCameraVisible=r.shadowCameraVisible;t.shadowDarkness=r.shadowDarkness;t.shadowBias=r.shadowCascadeBias[u];n=r.shadowCascadeNearZ[u];r=r.shadowCascadeFarZ[u];t=t.pointsFrustum;t[0].z=n;t[1].z=n;t[2].z=n;t[3].z=n;t[4].z=r;t[5].z=r;t[6].z=r;t[7].z=r;y[o]=s;o++}else{y[o]=m;o++}}k=0;for(p=y.length;k<p;k++){m=y[k];if(!m.shadowMap){m.shadowMap=new THREE.WebGLRenderTarget(m.shadowMapWidth,\nm.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});m.shadowMapSize=new THREE.Vector2(m.shadowMapWidth,m.shadowMapHeight);m.shadowMatrix=new THREE.Matrix4}if(!m.shadowCamera){if(m instanceof THREE.SpotLight)m.shadowCamera=new THREE.PerspectiveCamera(m.shadowCameraFov,m.shadowMapWidth/m.shadowMapHeight,m.shadowCameraNear,m.shadowCameraFar);else if(m instanceof THREE.DirectionalLight)m.shadowCamera=new THREE.OrthographicCamera(m.shadowCameraLeft,m.shadowCameraRight,\nm.shadowCameraTop,m.shadowCameraBottom,m.shadowCameraNear,m.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}j.add(m.shadowCamera);b.autoUpdateScene&&j.updateMatrixWorld()}if(m.shadowCameraVisible&&!m.cameraHelper){m.cameraHelper=new THREE.CameraHelper(m.shadowCamera);m.shadowCamera.add(m.cameraHelper)}if(m.isVirtual&&s.originalCamera==l){q=l;o=m.shadowCamera;n=m.pointsFrustum;t=m.pointsWorld;g.set(Infinity,Infinity,Infinity);h.set(-Infinity,-Infinity,-Infinity);for(r=\n0;r<8;r++){u=t[r];u.copy(n[r]);THREE.ShadowMapPlugin.__projector.unprojectVector(u,q);o.matrixWorldInverse.multiplyVector3(u);if(u.x<g.x)g.x=u.x;if(u.x>h.x)h.x=u.x;if(u.y<g.y)g.y=u.y;if(u.y>h.y)h.y=u.y;if(u.z<g.z)g.z=u.z;if(u.z>h.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);\nif(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix,\nq.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;r.render=false;if(n.visible&&n.castShadow&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||e.contains(n))){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);r.render=true}}m=0;for(o=t.length;m<o;m++){r=t[m];if(r.render){n=r.object;r=r.buffer;u=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?d:c;r instanceof THREE.BufferGeometry?\nb.renderBufferDirect(q,j.__lights,null,u,r,n):b.renderBuffer(q,j.__lights,null,u,r,n)}}t=j.__webglObjectsImmediate;m=0;for(o=t.length;m<o;m++){r=t[m];n=r.object;if(n.visible&&n.castShadow){n._modelViewMatrix.multiply(q.matrixWorldInverse,n.matrixWorld);b.renderImmediateObject(q,j.__lights,null,c,n)}}}k=b.getClearColor();p=b.getClearAlpha();a.clearColor(k.r,k.g,k.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,e,f,g,h,j,l,k;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=0;d[a++]=-1;d[a++]=1;d[a++]=0;a=d[a++]=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),o=b.createShader(b.FRAGMENT_SHADER),q=b.createShader(b.VERTEX_SHADER);b.shaderSource(o,a.fragmentShader);b.shaderSource(q,a.vertexShader);b.compileShader(o);b.compileShader(q);b.attachShader(m,o);b.attachShader(m,q);b.linkProgram(m);h=m;j={};l={};j.position=b.getAttribLocation(h,\"position\");j.uv=b.getAttribLocation(h,\"uv\");l.uvOffset=b.getUniformLocation(h,\"uvOffset\");l.uvScale=b.getUniformLocation(h,\n\"uvScale\");l.rotation=b.getUniformLocation(h,\"rotation\");l.scale=b.getUniformLocation(h,\"scale\");l.alignment=b.getUniformLocation(h,\"alignment\");l.color=b.getUniformLocation(h,\"color\");l.map=b.getUniformLocation(h,\"map\");l.opacity=b.getUniformLocation(h,\"opacity\");l.useScreenCoordinates=b.getUniformLocation(h,\"useScreenCoordinates\");l.affectedByDistance=b.getUniformLocation(h,\"affectedByDistance\");l.screenPosition=b.getUniformLocation(h,\"screenPosition\");l.modelViewMatrix=b.getUniformLocation(h,\"modelViewMatrix\");\nl.projectionMatrix=b.getUniformLocation(h,\"projectionMatrix\");k=false};this.render=function(d,e,o,q){var d=d.__webglSprites,n=d.length;if(n){var r=j,u=l,t=q/o,o=o*0.5,y=q*0.5,s=true;b.useProgram(h);if(!k){b.enableVertexAttribArray(r.position);b.enableVertexAttribArray(r.uv);k=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(r.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(r.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\ng);b.uniformMatrix4fv(u.projectionMatrix,false,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(u.map,0);for(var w,H=[],r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0)if(w.useScreenCoordinates)w.z=-w.position.z;else{w._modelViewMatrix.multiply(e.matrixWorldInverse,w.matrixWorld);w.z=-w._modelViewMatrix.elements[14]}}d.sort(a);for(r=0;r<n;r++){w=d[r];if(w.visible&&w.opacity!==0&&w.map&&w.map.image&&w.map.image.width){if(w.useScreenCoordinates){b.uniform1i(u.useScreenCoordinates,1);\nb.uniform3f(u.screenPosition,(w.position.x-o)/o,(y-w.position.y)/y,Math.max(0,Math.min(1,w.position.z)))}else{b.uniform1i(u.useScreenCoordinates,0);b.uniform1i(u.affectedByDistance,w.affectedByDistance?1:0);b.uniformMatrix4fv(u.modelViewMatrix,false,w._modelViewMatrix.elements)}e=w.map.image.width/(w.scaleByViewport?q:1);H[0]=e*t*w.scale.x;H[1]=e*w.scale.y;b.uniform2f(u.uvScale,w.uvScale.x,w.uvScale.y);b.uniform2f(u.uvOffset,w.uvOffset.x,w.uvOffset.y);b.uniform2f(u.alignment,w.alignment.x,w.alignment.y);\nb.uniform1f(u.opacity,w.opacity);b.uniform3f(u.color,w.color.r,w.color.g,w.color.b);b.uniform1f(u.rotation,w.rotation);b.uniform2fv(u.scale,H);if(w.mergeWith3D&&!s){b.enable(b.DEPTH_TEST);s=true}else if(!w.mergeWith3D&&s){b.disable(b.DEPTH_TEST);s=false}c.setBlending(w.blending,w.blendEquation,w.blendSrc,w.blendDst);c.setTexture(w.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};\nTHREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=\nfunction(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var j,l,k,p,m,o;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);f.multiply(h.projectionMatrix,\nh.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(this.renderTarget);b.clear();o=g.__webglObjects;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;k.render=false;if(m.visible&&(!(m instanceof THREE.Mesh)||!m.frustumCulled||e.contains(m))){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);k.render=true}}j=0;for(l=o.length;j<l;j++){k=o[j];if(k.render){m=k.object;k=k.buffer;b.setObjectFaces(m);p=m.customDepthMaterial?m.customDepthMaterial:m.geometry.morphTargets.length?d:c;k instanceof\nTHREE.BufferGeometry?b.renderBufferDirect(h,g.__lights,null,p,k,m):b.renderBuffer(h,g.__lights,null,p,k,m)}}o=g.__webglObjectsImmediate;j=0;for(l=o.length;j<l;j++){k=o[j];m=k.object;if(m.visible&&m.castShadow){m._modelViewMatrix.multiply(h.matrixWorldInverse,m.matrixWorld);b.renderImmediateObject(h,g.__lights,null,c,m)}}j=b.getClearColor();l=b.getClearAlpha();a.clearColor(j.r,j.g,j.b,l);a.enable(a.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = (       visibility.r / 9.0 ) *\\n( 1.0 - visibility.g / 9.0 ) *\\n(       visibility.b / 9.0 ) *\\n( 1.0 - visibility.a / 9.0 );\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform int renderType;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform int renderType;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\nTHREE.ShaderSprite={sprite:{vertexShader:\"uniform int useScreenCoordinates;\\nuniform int affectedByDistance;\\nuniform vec3 screenPosition;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 alignment;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position + alignment;\\nvec2 rotatedPosition;\\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\\nvec4 finalPosition;\\nif( useScreenCoordinates != 0 ) {\\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\\n} else {\\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\\n}\\ngl_Position = finalPosition;\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n}\"}};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/BloomPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// screen material\n\n\tvar screenShader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms );\n\n\tthis.screenUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialScreen = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.screenUniforms,\n\t\tvertexShader: screenShader.vertexShader,\n\t\tfragmentShader: screenShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tvar convolutionShader = THREE.ShaderExtras[ \"convolution\" ];\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ShaderExtras.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader:   \"#define KERNEL_SIZE \" + kernelSize + \".0\\n\" + convolutionShader.vertexShader,\n\t\tfragmentShader: \"#define KERNEL_SIZE \" + kernelSize + \"\\n\"   + convolutionShader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tTHREE.EffectComposer.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].texture = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tTHREE.EffectComposer.quad.material = this.materialScreen;\n\n\t\tthis.screenUniforms[ \"tDiffuse\" ].texture = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n\n\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/DotScreenPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function( center, angle, scale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"dotscreen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined )\n\t\tthis.uniforms[ \"center\" ].value.copy( center );\n\n\tif ( angle !== undefined )\tthis.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined )\tthis.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/EffectComposer.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tthis.renderTarget1 = renderTarget;\n\n\tif ( this.renderTarget1 === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.ShaderExtras[ \"screen\" ] );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tthis.renderTarget1 = renderTarget;\n\n\t\tif ( this.renderTarget1 === undefined ) {\n\n\t\t\tthis.renderTarget1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t\t}\n\n\t\tthis.renderTarget2 = this.renderTarget1.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\n\t\tTHREE.EffectComposer.camera.left = window.innerWidth / - 2;\n\t\tTHREE.EffectComposer.camera.right = window.innerWidth / 2;\n\t\tTHREE.EffectComposer.camera.top = window.innerHeight / 2;\n\t\tTHREE.EffectComposer.camera.bottom = window.innerHeight / - 2;\n\n\t\tTHREE.EffectComposer.camera.updateProjectionMatrix();\n\n\t}\n\n};\n\n// shared ortho camera\n\nTHREE.EffectComposer.camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );\n\n// shared fullscreen quad scene\n\nTHREE.EffectComposer.geometry = new THREE.PlaneGeometry( 1, 1 );\n\nTHREE.EffectComposer.quad = new THREE.Mesh( THREE.EffectComposer.geometry, null );\nTHREE.EffectComposer.quad.position.z = -100;\nTHREE.EffectComposer.quad.scale.set( window.innerWidth, window.innerHeight, 1 );\n\nTHREE.EffectComposer.scene = new THREE.Scene();\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.quad );\nTHREE.EffectComposer.scene.add( THREE.EffectComposer.camera );\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/FilmPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tvar shader = THREE.ShaderExtras[ \"film\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].texture = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/MaskPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/RenderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/SavePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function( renderTarget ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBufer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/ShaderPass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].texture = readBuffer;\n\n\t\t}\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/three.js/postprocessing/TexturePass.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function( texture, opacity ) {\n\n\tvar shader = THREE.ShaderExtras[ \"screen\" ];\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].texture = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tTHREE.EffectComposer.quad.material = this.material;\n\n\t\trenderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );\n\n\t}\n\n};\n"
  },
  {
    "path": "TJunctions/vendor/threex/Makefile",
    "content": "# simple makefile to avoid repeatitive tasks\n\nbuildDoc:\n\tdocco *.js\n\nmonitorDoc: build\n\t(while inotifywait -r -e modify,attrib,create . ; do make build; done)\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n\n"
  },
  {
    "path": "TJunctions/vendor/threex/README.md",
    "content": "* This should be the root of a git repository but i dunno how to handle submodule\n\n# TODO\n* document those\n  * you write a lot of code but not a lot of doc\n  * all that could go in learningthreejs\n  * what about anotated source.\n  * easy to write.\n  * how to present it in the blog\n  * currently anotated source is isnt too embedable\n  * should it be a blocker ?\n  * likely not\n  * make a super simple post for each\n* they need example and all\n  * how to handle this ?\n  * an examples directory like three.js ?\n    * why not ?\n* how to handle the maturity of it ?\n  * many arent too finished"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.CelShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\n// cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0\nTHREEx.UniformsLib['cel']\t= {\n      \"uDirLightPos\"\t\t: { type: \"v3\", value: new THREE.Vector3(1,0,0) },\n      \"uDirLightColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xeeeeee ) },\n      \"uAmbientLightColor\"\t: { type: \"c\" , value: new THREE.Color( 0x050505 ) },\n      \"uBaseColor\"\t\t: { type: \"c\" , value: new THREE.Color( 0xff0000 ) }\n};\n\nTHREEx.ShaderLib['cel']\t= {\n\tvertexShader:\t[\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"vec4 mPosition = objectMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\",\n\t\t      \n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\t\t      \n\t\t\t\"vec3 I = mPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), nWorld, 1.02 );\",\n\t\t      \n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\t\t\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\t\t\n\t\t\"varying vec3 vNormal;\",\n\t\t\n\t\t\"varying vec3 vRefract;\",\n\t\t\n\t\t\"void main() {\",\n\t\t\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\t\t      \n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\t\t      \n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\t\t      \n\t\t\t\"if ( intensity < 0.50 ) {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\t\t      \n\t\t\t\"} else {\",\n\t\t      \n\t\t\t  \"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\t\t      \n\t\t\t\"}\",\n\t\t\n\t\t\"}\"\t\t\n\t].join( \"\\n\" )\n};"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.DeviceOrientationState.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DeviceOrientationState\t= function()\n{\n\t// to store the current state\n\tthis._state\t= { x: 0, y: 0, z: 0 };\n\n\tthis._$callback\t= function(event){ this._onDeviceOrientation(event); }.bind(this);\n\t\n\t// bind events\n\t// - spec http://dev.w3.org/geo/api/spec-source-orientation.html\n\twindow.addEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.DeviceOrientationState.prototype.destroy\t= function()\n{\n\t// unbind events\n\twindow.removeEventListener('deviceorientation', this._$callback);\n}\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.DeviceOrientationState.prototype._onDeviceOrientation\t= function(event)\n{\n\tthis._state.x\t= (!event.alpha ? 0 : event.alpha) * Math.PI / 180;\n\tthis._state.y\t= (!event.beta  ? 0 : event.beta ) * Math.PI / 180;\n\tthis._state.z\t= (!event.gamma ? 0 : event.gamma) * Math.PI / 180;\n}\n\n\nTHREEx.DeviceOrientationState.prototype.angleX\t= function()\n{\n\treturn this._state.x;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleY\t= function()\n{\n\treturn this._state.y;\n}\n\nTHREEx.DeviceOrientationState.prototype.angleZ\t= function()\n{\n\treturn this._state.z;\n}\n\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n/**\n * Bind a key to renderer screenshot\n*/\nTHREEx.FullScreen.bindKey\t= function(opts){\n\topts\t\t= opts\t\t|| {};\n\tvar charCode\t= opts.charCode\t|| 'f'.charCodeAt(0);\n\tvar dblclick\t= opts.dblclick !== undefined ? opts.dblclick : false;\n\tvar element\t= opts.element\n\n\tvar toggle\t= function(){\n\t\tif( THREEx.FullScreen.activated() ){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t}else{\n\t\t\tTHREEx.FullScreen.request(element);\n\t\t}\t\t\n\t}\n\n\t// callback to handle keypress\n\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\tvar onKeyPress\t= __bind(function(event){\n\t\t// return now if the KeyPress isnt for the proper charCode\n\t\tif( event.which !== charCode )\treturn;\n\t\t// toggle fullscreen\n\t\ttoggle();\n\t}, this);\n\n\t// listen to keypress\n\t// NOTE: for firefox it seems mandatory to listen to document directly\n\tdocument.addEventListener('keypress', onKeyPress, false);\n\t// listen to dblclick\n\tdblclick && document.addEventListener('dblclick', toggle, false);\n\n\treturn {\n\t\tunbind\t: function(){\n\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\tdblclick && document.removeEventListener('dblclick', toggle, false);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.GeometryUtils.js",
    "content": "// This THREEx helper provide various basic functions for ```THREE.Geometry```.\n// It is able to scale, translate, center a geometry. Other functions may be\n// added soon.\n// The API is chained for convenience.\n//\n// ## Scale \n// To make the geometry twice larger in ```y```\n\n// ```\n//   var scale = new THREE.Vector3(1,2,1);\n//   THREEx.GeometryUtils.scale(geometry, scale);\n// ```\n\n// ## Translate\n// To make the geometry move 100 further in ```x```\n\n// ```\n//   var translation = new THREE.Vector3(100,0,0);\n//   THREEx.GeometryUtils.translate(geometry, translation);\n// ```\n\n// ## Center\n// To center the geometry on its middle point\n\n// ```\n//   THREEx.GeometryUtils.center(geometry);\n// ```\n\n// ## middlePoint\n// To compute the middle point of a geometry\n\n// ```\n//   THREEx.GeometryUtils.middlePoint(geometry);\n// ```\n\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.GeometryUtils\t= THREEx.GeometryUtils\t|| {};\n\n// TODO\n// - chained API\n// - possibility a matrix to reduce computation ?\n\n/**\n * Change the scale of a geometry\n * \n * @params {THREE.Geometry} geometry the geometry to compute on\n * @params {THREE.Vector3} scale the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.scale\t= function(geometry, scale)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.multiplySelf(scale); \n\t}\n\t\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\n\t// return this, to get chained API\t\n\treturn this;\n}\n\nTHREEx.GeometryUtils.translate\t= function(geometry, delta)\n{\n\t// change all geometry.vertices\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.position.addSelf(delta); \n\t}\n\n\t// mark the vertices as dirty\n\tgeometry.__dirtyVertices = true;\n\t// return this, to get chained API\t\n\treturn this;\n}\n\n/**\n * Compute the \"middlePoint\" aka the point at the middle of the boundingBox\n * \n * @params {THREE.Geometry} the geometry to compute on\n * @returns {THREE.Vector3} the middlepoint of the geometry\n*/\nTHREEx.GeometryUtils.middlePoint\t= function(geometry)\n{\n\t// compute bounding box\n\tgeometry.computeBoundingBox();\n\n\t// compute middle\n\tvar middle\t= new THREE.Vector3()\n\tmiddle.x\t= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;\n\tmiddle.y\t= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;\n\tmiddle.z\t= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;\n\n\t// return the just computed middle\n\treturn middle;\n}\n\n/**\n * Center the geometry on its middlepoint\n*/\nTHREEx.GeometryUtils.center\t= function(geometry, noX, noY, noZ)\n{\n\t// compute delta\n\tvar delta\t= this.middlePoint(geometry).negate();\n\tif( noX )\tdelta.x\t= 0;\n\tif( noY )\tdelta.y\t= 0;\n\tif( noZ )\tdelta.z\t= 0;\n\n\treturn this.translate(geometry, delta)\n}\n\n/**\n * Initial version of attachement\n * - geometry2 is the one which is moved\n * - TODO make something more flexible... especially on the attachement config\n*/\nTHREEx.GeometryUtils.attachRightLeft\t= function(geometry1, geometry2, delta)\n{\n\tif( delta === undefined )\tdelta\t= 0;\n\t// compute bounding box\n\tgeometry1.computeBoundingBox();\n\tgeometry2.computeBoundingBox();\n\t\n\tvar maxX1\t= geometry1.boundingBox.x[ 1 ]\n\tvar minX2\t= geometry2.boundingBox.x[ 0 ];\n\n\tvar vector\t= new THREE.Vector3();\n\tvector.x\t= maxX1+ (-minX2) + delta;\n\n\tthis.translate(geometry2, vector);\n\t\n\treturn this;\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.GeometryWobble.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.GeometryWobble\t= {};\n\n// Geometry Wobble\n// based on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/\n\n\nTHREEx.GeometryWobble.init\t= function(geometry)\n{\n\tfor(var i = 0; i < geometry.vertices.length; i++){\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvertex.originalPosition\t= vertex.position.clone();\n\t\tvertex.dirVector\t= vertex.position.clone().normalize();\n\t}\n\tgeometry.dynamic\t= true;\n\t\n\tthis.cpuAxis(geometry, 'y')\n}\n\nTHREEx.GeometryWobble.cpuAxis\t= function(geometry, type, factor)\n{\n\tif( type === undefined )\ttype\t= 'x';\n\tif( factor === undefined )\tfactor\t= 0.2;\n\t\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n// Note: may need more axis ?\n\t\tif( type === 'x' )\tvertex.axisValue\t= vertex.originalPosition.x * factor;\n\t\telse if( type === 'y' )\tvertex.axisValue\t= vertex.originalPosition.y * factor;\n\t\telse if( type === 'z' )\tvertex.axisValue\t= vertex.originalPosition.z * factor;\n\t\telse\tconsole.assert(false);\n\t}\n}\n\nTHREEx.GeometryWobble.Animate\t= function(geometry, phase, magnitude)\n{\n\tif( phase === undefined )\tphase\t\t= 0;\n\tif( magnitude === undefined )\tmagnitude\t= 0.2;\n\t\n\tif( typeof magnitude === \"number\" )\tmagnitude\t= new THREE.Vector3(magnitude, magnitude, magnitude)\n\n\n\tfor(var i = 0; i < geometry.vertices.length; i++) {\n\t\tvar vertex\t= geometry.vertices[i];\n\t\tvar vertexPhase\t= Math.cos(phase + vertex.axisValue);\n\t\t\n\t\tvertex.position.x = vertex.originalPosition.x + vertexPhase * vertex.dirVector.x * magnitude.x;\n\t\tvertex.position.y = vertex.originalPosition.y + vertexPhase * vertex.dirVector.y * magnitude.y;\n\t\tvertex.position.z = vertex.originalPosition.z + vertexPhase * vertex.dirVector.z * magnitude.z;\n\t}\n\t\n\tgeometry.__dirtyVertices = true;\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.KeyboardState.js",
    "content": "// THREEx.KeyboardState.js keep the current state of the keyboard.\n// It is possible to query it at any time. No need of an event.\n// This is particularly convenient in loop driven case, like in\n// 3D demos or games.\n//\n// # Usage\n//\n// **Step 1**: Create the object\n//\n// ```var keyboard\t= new THREEx.KeyboardState();```\n//\n// **Step 2**: Query the keyboard state\n//\n// This will return true if shift and A are pressed, false otherwise\n//\n// ```keyboard.pressed(\"shift+A\")```\n//\n// **Step 3**: Stop listening to the keyboard\n//\n// ```keyboard.destroy()```\n//\n// NOTE: this library may be nice as standaline. independant from three.js\n// - rename it keyboardForGame\n//\n// # Code\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * - NOTE: it would be quite easy to push event-driven too\n *   - microevent.js for events handling\n *   - in this._onkeyChange, generate a string from the DOM event\n *   - use this as event name\n*/\nTHREEx.KeyboardState\t= function()\n{\n\t// to store the current state\n\tthis.keyCodes\t= {};\n\tthis.modifiers\t= {};\n\t\n\t// create callback to bind/unbind keyboard events\n\tvar self\t= this;\n\tthis._onKeyDown\t= function(event){ self._onKeyChange(event, true); };\n\tthis._onKeyUp\t= function(event){ self._onKeyChange(event, false);};\n\n\t// bind keyEvents\n\tdocument.addEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.addEventListener(\"keyup\", this._onKeyUp, false);\n}\n\n/**\n * To stop listening of the keyboard events\n*/\nTHREEx.KeyboardState.prototype.destroy\t= function()\n{\n\t// unbind keyEvents\n\tdocument.removeEventListener(\"keydown\", this._onKeyDown, false);\n\tdocument.removeEventListener(\"keyup\", this._onKeyUp, false);\n}\n\nTHREEx.KeyboardState.MODIFIERS\t= ['shift', 'ctrl', 'alt', 'meta'];\nTHREEx.KeyboardState.ALIAS\t= {\n\t'left'\t\t: 37,\n\t'up'\t\t: 38,\n\t'right'\t\t: 39,\n\t'down'\t\t: 40,\n\t'space'\t\t: 32,\n\t'pageup'\t: 33,\n\t'pagedown'\t: 34,\n\t'tab'\t\t: 9\n};\n\n/**\n * to process the keyboard dom event\n*/\nTHREEx.KeyboardState.prototype._onKeyChange\t= function(event, pressed)\n{\n\t// log to debug\n\t//console.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n\t// update this.keyCodes\n\tvar keyCode\t\t= event.keyCode;\n\tthis.keyCodes[keyCode]\t= pressed;\n\n\t// update this.modifiers\n\tthis.modifiers['shift']= event.shiftKey;\n\tthis.modifiers['ctrl']\t= event.ctrlKey;\n\tthis.modifiers['alt']\t= event.altKey;\n\tthis.modifiers['meta']\t= event.metaKey;\n}\n\n/**\n * query keyboard state to know if a key is pressed of not\n *\n * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A\n * @returns {Boolean} true if the key is pressed, false otherwise\n*/\nTHREEx.KeyboardState.prototype.pressed\t= function(keyDesc)\n{\n\tvar keys\t= keyDesc.split(\"+\");\n\tfor(var i = 0; i < keys.length; i++){\n\t\tvar key\t\t= keys[i];\n\t\tvar pressed;\n\t\tif( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){\n\t\t\tpressed\t= this.modifiers[key];\n\t\t}else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){\n\t\t\tpressed\t= this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];\n\t\t}else {\n\t\t\tpressed\t= this.keyCodes[key.toUpperCase().charCodeAt(0)]\n\t\t}\n\t\tif( !pressed)\treturn false;\n\t};\n\treturn true;\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.LogoTurtle.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx\t|| {};\n\n// TODO should those relative polar coord function be INSIDE path already ?\n\nTHREEx.LogoTurtle\t= function()\n{\n\tthis._penX\t= 0;\n\tthis._penY\t= 0;\n\tthis._angle\t= 0;\n\tthis._vectors\t= [];\n}\n\nTHREEx.LogoTurtle.create\t= function()\n{\n\treturn new THREEx.LogoTurtle()\n}\n\nTHREEx.LogoTurtle.prototype.turn\t= function(rotation)\n{\n\tthis._angle\t+= rotation;\n\treturn this;\t\n}\n\nTHREEx.LogoTurtle.prototype.moveTo\t= function(x, y)\n{\n\tthis._penX\t= x * Math.cos(this._angle) - y * Math.sin(this._angle);\n\tthis._penY\t= x * Math.sin(this._angle) + y * Math.cos(this._angle);\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.forward\t= function(distance)\n{\n\tthis._penX\t+= Math.cos(this._angle) * distance;\n\tthis._penY\t+= Math.sin(this._angle) * distance;\n\n\tthis._vectors.push( new THREE.Vector2(this._penX, this._penY) );\t\n\t\n\treturn this;\n}\n\nTHREEx.LogoTurtle.prototype.points\t= function()\n{\n\treturn this._vectors;\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.PlasmaShader.js",
    "content": "// define namespaces\nvar THREEx\t\t= THREEx || {};\nTHREEx.ShaderLib\t= THREEx.ShaderLib\t|| {};\nTHREEx.UniformsLib\t= THREEx.UniformsLib\t|| {};\n\nTHREEx.UniformsLib['plasma']\t= {\n\ttime\t: { type : \"f\", value:  0.0 },\n\tscale\t: { type : \"f\", value:  1.0 },\n\trotation: { type : \"f\", value:  0.0 },\n\topacity\t: { type : \"f\", value:  1.0 },\n\n\tc0\t: { type : \"f\", value:  5.0 },\n\tc1\t: { type : \"f\", value:  3.0 },\n\tc2\t: { type : \"f\", value: 11.0 },\n\tc3\t: { type : \"f\", value:  7.0 },\n\tc4\t: { type : \"f\", value:  9.0 },\n\tc5\t: { type : \"f\", value:  3.0 }\t\n};\n\nTHREEx.ShaderLib['plasma']\t= {\n\tvertexShader:\t[\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main(){\",\n\t\t\t\"vUv\t= uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\",\n\t\t\"}\"\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#ifdef GL_ES\",\n\t\t\t\"precision highp float;\",\n\t\t\"#endif\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform float time;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform float rotation;\",\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float c0, c1, c2, c3, c4, c5;\",\n\n\t\t// todo zoom and rotation of vec2 point\n\t\t\"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){\",\n\t\t\t\"vec2 tmp;\",\n\t\t\t\"tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);\",\n\t\t\t\"tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);\",\n\t\t\t\"tmp\t\t= tmp * scale;\",\n\t\t\t\"return tmp;\",\n\t\t\"}\",\n\t\t\n\t\t// based on THREE.Color.setHSV()\n\t\t// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions\n\t\t\"vec3 HSVtoRGB(const vec3 color){\",\n\t\t\t\"float h\t= color.r;\",\n\t\t\t\"float s\t= color.g;\",\n\t\t\t\"float v\t= color.b;\",\n\n\t\t\t\"float i\t= floor(h * 6.0);\",\n\t\t\t\"float f\t= (h * 6.0) - i;\",\n\t\t\t\"float p\t= v * (1.0 - s);\",\n\t\t\t\"float q\t= v * (1.0 - f * s);\",\n\t\t\t\"float t\t= v * (1.0 - (1.0 - f) * s);\",\n\n\t\t\t\"vec3 result;\",\n\t\t\t\"if( i < 1.0 )\t\tresult = vec3(v,t,p);\",\n\t\t\t\"else if( i < 2.0 )\tresult = vec3(q,v,p);\",\n\t\t\t\"else if( i < 3.0 )\tresult = vec3(p,v,t);\",\n\t\t\t\"else if( i < 4.0 )\tresult = vec3(p,q,v);\",\n\t\t\t\"else if( i < 5.0 )\tresult = vec3(t,p,v);\",\n\t\t\t\"else if( i < 6.0 )\tresult = vec3(v,p,q);\",\n\t\t\t\"else \t\t\tresult = vec3(v,t,p);\",\n\n\t\t\t\"return result;\",\n\t\t\"}\",\n\t\t// default value\n\t\t\"#ifndef ROTOZOOM\",\n\t\t\t\"#define ROTOZOOM 1\",\n\t\t\"#endif\",\n\t\t\"#ifndef USEHSV\",\n\t\t\t\"#define USEHSV 1\",\n\t\t\"#endif\",\n\t\t\n\t\t\"void main(){\",\n\t\t\t\"vec2 p\t\t= -1.0 + 2.0 * vUv;\",\n\t\t\t\"#if ROTOZOOM\",\n\t\t\t\t\"p \t= rotoZoom(p, scale, rotation);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);\",\n\t\t\t\"float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);\",\n\t\t\t\"float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);\",\n\t\t\t//\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));\",\n\t\t\t\"vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));\",\n\n\t\t\t\"#if USEHSV\",\n\t\t\t\t\"color\t= HSVtoRGB(color);\",\n\t\t\t\"#endif\",\n\n\t\t\t\"gl_FragColor\t= vec4(color, opacity);\",\n\t\t\t//\"gl_FragColor\t= vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.SkyMap.js",
    "content": "var THREEx\t\t= THREEx || {};\n\nTHREEx.SkyMap\t= {};\n\nTHREEx.SkyMap.buildMesh\t= function(urls, opts)\n{\n\t// get parameters\n\topts\t\t= opts || {}\n\tvar cubeSize\t= opts.cubeSize !== undefined ? opts.cubeSize\t: 100000;\n\n\t// load the cube textures\n\tvar texture\t= THREE.ImageUtils.loadTextureCube( urls );\n\t\n\t// init the cube shadder\n\tvar shader\t= THREE.ShaderUtils.lib[\"cube\"];\n\tvar uniforms\t= THREE.UniformsUtils.clone( shader.uniforms );\n\tuniforms['tCube'].texture= textureCube;\n\tvar material = new THREE.MeshShaderMaterial({\n\t\tfragmentShader\t: shader.fragmentShader,\n\t\tvertexShader\t: shader.vertexShader,\n\t\tuniforms\t: uniforms\n\t});\n\n\t// build the geometry\n\tvar geometry\t= new THREE.CubeGeometry( cubeSize, cubeSize, cubeSize, 1, 1, 1, null, true );\n\n\t// build the skybox Mesh\n\tvar mesh\t= new THREE.Mesh( geometry, material );\n\treturn mesh;\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPosx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"posx\" + extension,\n\t\tprefix + \"negx\" + extension,\n\t\tprefix + \"posy\" + extension,\n\t\tprefix + \"negy\" + extension,\n\t\tprefix + \"posz\" + extension,\n\t\tprefix + \"negz\" + extension\n\t];\n\treturn urls;\t\n}\n\n/**\n * Build the urls array for THREEx.SkyMap.buildMesh()\n*/\nTHREEx.SkyMap.UrlsPx\t= function(prefix, extension)\n{\n\treturn [\n\t\tprefix + \"px\" + extension,\n\t\tprefix + \"nx\" + extension,\n\t\tprefix + \"py\" + extension,\n\t\tprefix + \"ny\" + extension,\n\t\tprefix + \"pz\" + extension,\n\t\tprefix + \"nz\" + extension\n\t];\n\treturn urls;\t\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.WindowResize.js",
    "content": "// This THREEx helper makes it easy to handle window resize.\n// It will update renderer and camera when window is resized.\n//\n// # Usage\n//\n// **Step 1**: Start updating renderer and camera\n//\n// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```\n//    \n// **Step 2**: Start updating renderer and camera\n//\n// ```windowResize.stop()```\n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n/**\n * Update renderer and camera when the window is resized\n * \n * @param {Object} renderer the renderer to update\n * @param {Object} Camera the camera to update\n*/\nTHREEx.WindowResize\t= function(renderer, camera){\n\tvar callback\t= function(){\n\t\t// notify the renderer of the size change\n\t\trenderer.setSize( window.innerWidth, window.innerHeight );\n\t\t// update the camera\n\t\tcamera.aspect\t= window.innerWidth / window.innerHeight;\n\t\tcamera.updateProjectionMatrix();\n\t}\n\t// bind the resize event\n\twindow.addEventListener('resize', callback, false);\n\t// return .stop() the function to stop watching window resize\n\treturn {\n\t\t/**\n\t\t * Stop watching window resize\n\t\t*/\n\t\tstop\t: function(){\n\t\t\twindow.removeEventListener('resize', callback);\n\t\t}\n\t};\n}\n\nTHREEx.WindowResize.bind\t= function(renderer, camera){\n\treturn THREEx.WindowResize(renderer, camera);\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.glCapability.js",
    "content": "/**\n * Define namespace\n*/\nif(typeof THREEx === \"undefined\")\tvar THREEx\t= {};\n\n\n/**\n * return the capability of a WebGl context\n *\n * TODO to rewrite\n * - heavily wased on webglreport on sourceforge\n * - is there other/better properties\n * - should i get a more readable output ?\n *   - another function ?\n *\n * @param {WebGLRenderingContext} webgl context\n * @returns {Object} capabilities\n*/\nTHREEx.glCapability\t= function(gl)\n{\n\t// sanity check - gl context MUST BE WebGLRenderingContext\n\tconsole.assert(gl instanceof WebGLRenderingContext)\n\t// TODO find better names\n\tvar prout\t= ['VERSION', 'SHADING_LANGUAGE_VERSION', 'VENDOR', 'RENDERER'];\n\tvar pixDepth\t= ['RED_BITS', 'GREEN_BITS', 'BLUE_BITS', 'ALPHA_BITS', 'DEPTH_BITS', 'STENCIL_BITS'];\n\tvar slota\t= ['MAX_RENDERBUFFER_SIZE', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', 'MAX_CUBE_MAP_TEXTURE_SIZE'\n\t\t\t\t, 'MAX_FRAGMENT_UNIFORM_VECTORS', 'MAX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_TEXTURE_SIZE', 'MAX_VERTEX_ATTRIBS'\n\t\t\t\t, 'MAX_VERTEX_ATTRIBS', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS'\n\t\t\t\t, 'MAX_VERTEX_UNIFORM_VECTORS'];\t\n\tvar sloti\t= ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE', 'MAX_VIEWPORT_DIMS'];\n\t\n\tvar info\t= {};\n\tvar collect\t= function(arr){\n\t\tarr.forEach(function(parameter){\n\t\t\t//console.log('parameter', parameter)\n\t\t\tinfo[parameter]\t= gl.getParameter(gl[parameter])\n\t\t})\n\t}\n\t\n\tcollect(prout);\n\tcollect(pixDepth);\n\tcollect(slota);\n\tcollect(sloti)\n\t\n\t// special case to get the extensions\n\tinfo['SUPPORTED_EXTENSIONS']\t= gl.getSupportedExtensions()\n\t\n\t//console.log(\"info\");\n\t//console.dir(info)\n\treturn info;\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.requestAnimationFrame.js",
    "content": "/**\n * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.\n * from paul irish + jerome etienne\n * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html\n */\n\nif ( !window.requestAnimationFrame ) {\n\n\twindow.requestAnimationFrame = ( function() {\n\n\t\treturn window.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\twindow.oRequestAnimationFrame ||\n\t\twindow.msRequestAnimationFrame ||\n\t\tfunction( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n\n\t\t\treturn window.setTimeout( callback, 1000 / 60 );\n\n\t\t};\n\n\t} )();\n\n}\n\nif ( !window.cancelRequestAnimationFrame ) {\n\n\twindow.cancelRequestAnimationFrame = ( function() {\n\n\t\treturn window.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\twindow.oCancelRequestAnimationFrame ||\n\t\twindow.msCancelRequestAnimationFrame ||\n\t\tclearTimeout\n\n\t} )();\n\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/THREEx.screenshot.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\n// TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\n// able to upload your screenshot without running servers\n\n// forced closure\n(function(){\n\n\t/**\n\t * Take a screenshot of a renderer\n\t * - require WebGLRenderer to have \"preserveDrawingBuffer: true\" to be set\n\t * - TODO is it possible to check if this variable is set ? if so check it\n\t *   and make advice in the console.log\n\t *   - maybe with direct access to the gl context...\n\t * \n\t * @param {Object} renderer to use\n\t * @param {String} mimetype of the output image. default to \"image/png\"\n\t * @param {String} dataUrl of the image\n\t*/\n\tvar toDataURL\t= function(renderer, mimetype)\n\t{\n\t\tmimetype\t= mimetype\t|| \"image/png\";\n\t\tvar dataUrl\t= renderer.domElement.toDataURL(mimetype);\n\t\treturn dataUrl;\n\t}\n\n\t/**\n\t * resize an image to another resolution while preserving aspect\n\t *\n\t * @param {String} srcUrl the url of the image to resize\n\t * @param {Number} dstWidth the destination width of the image\n\t * @param {Number} dstHeight the destination height of the image\n\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)\n\t*/\n\tvar _aspectResize\t= function(srcUrl, dstW, dstH, callback){\n\t\t// to compute the width/height while keeping aspect\n\t\tvar cpuScaleAspect\t= function(maxW, maxH, curW, curH){\n\t\t\tvar ratio\t= curH / curW;\n\t\t\tif( curW >= maxW && ratio <= 1 ){ \n\t\t\t\tcurW\t= maxW;\n\t\t\t\tcurH\t= maxW * ratio;\n\t\t\t}else if(curH >= maxH){\n\t\t\t\tcurH\t= maxH;\n\t\t\t\tcurW\t= maxH / ratio;\n\t\t\t}\n\t\t\treturn { width: curW, height: curH };\n\t\t}\n\t\t// callback once the image is loaded\n\t\tvar __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onLoad\t= __bind(function(){\n\t\t\t// init the canvas\n\t\t\tvar canvas\t= document.createElement('canvas');\n\t\t\tcanvas.width\t= dstW;\tcanvas.height\t= dstH;\n\t\t\tvar ctx\t\t= canvas.getContext('2d');\n\n\t\t\t// TODO is this needed\n\t\t\tctx.fillStyle\t= \"black\";\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// scale the image while preserving the aspect\n\t\t\tvar scaled\t= cpuScaleAspect(canvas.width, canvas.height, image.width, image.height);\n\n\t\t\t// actually draw the image on canvas\n\t\t\tvar offsetX\t= (canvas.width  - scaled.width )/2;\n\t\t\tvar offsetY\t= (canvas.height - scaled.height)/2;\n\t\t\tctx.drawImage(image, offsetX, offsetY, scaled.width, scaled.height);\n\n\t\t\t// dump the canvas to an URL\t\t\n\t\t\tvar mimetype\t= \"image/png\";\n\t\t\tvar newDataUrl\t= canvas.toDataURL(mimetype);\n\t\t\t// notify the url to the caller\n\t\t\tcallback && callback(newDataUrl)\n\t\t}, this);\n\n\t\t// Create new Image object\n\t\tvar image \t= new Image();\n\t\timage.onload\t= onLoad;\n\t\timage.src\t= srcUrl;\n\t}\n\t\n\n\t// Super cooked function: THREEx.Screenshot.bindKey(renderer)\n\t// and you are done to get screenshot on your demo\n\n\t/**\n\t * Bind a key to renderer screenshot\n\t*/\n\tvar bindKey\t= function(renderer, opts){\n\t\t// handle parameters\n\t\topts\t\t= opts\t\t|| {};\n\t\tvar charCode\t= opts.charCode\t|| 'p'.charCodeAt(0);\n\t\tvar width\t= opts.width;\n\t\tvar height\t= opts.height;\n\t\tvar callback\t= opts.callback\t|| function(url){\n\t\t\twindow.open(url, \"name-\"+Math.random());\n\t\t};\n\n\t\t// callback to handle keypress\n\t\tvar __bind\t= function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\t\tvar onKeyPress\t= __bind(function(event){\n\t\t\t// return now if the KeyPress isnt for the proper charCode\n\t\t\tif( event.which !== charCode )\treturn;\n\t\t\t// get the renderer output\n\t\t\tvar dataUrl\t= this.toDataURL(renderer);\n\n\t\t\tif( width === undefined && height === undefined ){\n\t\t\t\tcallback( dataUrl )\n\t\t\t}else{\n\t\t\t\t// resize it and notify the callback\n\t\t\t\t// * resize == async so if callback is a window open, it triggers the pop blocker\n\t\t\t\t_aspectResize(dataUrl, width, height, callback);\t\t\t\t\n\t\t\t}\n\t\t}, this);\n\n\t\t// listen to keypress\n\t\t// NOTE: for firefox it seems mandatory to listen to document directly\n\t\tdocument.addEventListener('keypress', onKeyPress, false);\n\n\t\treturn {\n\t\t\tunbind\t: function(){\n\t\t\t\tdocument.removeEventListener('keypress', onKeyPress, false);\n\t\t\t}\n\t\t};\n\t}\n\n\t// export it\t\n\tTHREEx.Screenshot\t= {\n\t\ttoDataURL\t: toDataURL,\n\t\tbindKey\t\t: bindKey\n\t};\n})();\n"
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.CelShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CelShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CelShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>cel shader from ro.me - http://www.ro.me/tech/cel-shader - Apache License 2.0</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"s2\">&quot;uDirLightPos&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;v3&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uDirLightColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xeeeeee</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uAmbientLightColor&quot;</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0x050505</span> <span class=\"p\">)</span> <span class=\"p\">},</span>\n      <span class=\"s2\">&quot;uBaseColor&quot;</span>\t\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span><span class=\"o\">:</span> <span class=\"s2\">&quot;c&quot;</span> <span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Color</span><span class=\"p\">(</span> <span class=\"mh\">0xff0000</span> <span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;cel&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;vec4 mPosition = objectMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vNormal = normalize( normalMatrix * normal );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;vec3 I = mPosition.xyz - cameraPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vRefract = refract( normalize( I ), nWorld, 1.02 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * mvPosition;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uBaseColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightPos;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform vec3 uDirLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;uniform vec3 uAmbientLightColor;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vNormal;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec3 vRefract;&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main() {&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t\t<span class=\"s2\">&quot;float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += length(lightWeighting) * 0.2;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;float cameraWeighting = dot( normalize( vNormal ), vRefract );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;intensity = intensity * 0.2 + 0.3;&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;if ( intensity &lt; 0.50 ) {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;} else {&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t  <span class=\"s2\">&quot;gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );&quot;</span><span class=\"p\">,</span>\n\t\t      \n\t\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;}&quot;</span>\t\t\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.CubeMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.CubeMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.CubeMap.html\">                 THREEx.CubeMap.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.CubeMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Cubemap</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.DeviceOrientationState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.DeviceOrientationState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.DeviceOrientationState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"nx\">x</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"o\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">z</span><span class=\"o\">:</span> <span class=\"mi\">0</span> <span class=\"p\">};</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">);</span> <span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>bind events\n- spec http://dev.w3.org/geo/api/spec-source-orientation.html</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>unbind events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;deviceorientation&#39;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_$callback</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onDeviceOrientation</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">alpha</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span>  <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">beta</span> <span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span> <span class=\"o\">?</span> <span class=\"mi\">0</span> <span class=\"o\">:</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">gamma</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">PI</span> <span class=\"o\">/</span> <span class=\"mi\">180</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleX</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleY</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">DeviceOrientationState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">angleZ</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_state</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.FullScreen.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.FullScreen.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.FullScreen.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle the fullscreen API\n* it hides the prefix for each browser\n* it hides the little discrepencies of the various vendor API\n* at the time of this writing (nov 2011) it is available in \n  <a href=\"http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html\">firefox nightly</a>,\n  <a href=\"http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/\">webkit nightly</a> and\n  <a href=\"http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API\">chrome stable</a>.</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if it is possible to have fullscreen</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen API is available, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">available</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"o\">||</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * test if fullscreen is currently activated</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @returns {Boolean} true if fullscreen is currently activated, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">activated</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitIsFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"k\">return</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozFullScreen</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Request fullscreen on a given element</span>\n<span class=\"cm\"> * @param {DomElement} element to make fullscreen. optional. default to document.body</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">request</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">element</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"nx\">element</span>\t<span class=\"o\">=</span> <span class=\"nx\">element</span>\t<span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">body</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nx\">element</span><span class=\"p\">.</span><span class=\"nx\">mozRequestFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Cancel fullscreen</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">cancel</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span> <span class=\"p\">){</span>\n\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">mozCancelFullScreen</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span><span class=\"k\">else</span><span class=\"p\">{</span>\n\t\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>internal functions to know which fullscreen API implementation is available</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasWebkitFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;webkitCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">FullScreen</span><span class=\"p\">.</span><span class=\"nx\">_hasMozFullScreen</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;mozCancelFullScreen&#39;</span> <span class=\"k\">in</span> <span class=\"nb\">document</span>\t<span class=\"o\">?</span> <span class=\"kc\">true</span> <span class=\"o\">:</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\t\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.GeometryUtils.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryUtils.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryUtils.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper provide various basic functions for <code>THREE.Geometry</code>.\nIt is able to scale, translate, center a geometry. Other functions may be\nadded soon.\nThe API is chained for convenience.</p>\n\n<h2>Scale</h2>\n\n<p>To make the geometry twice larger in <code>y</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p><code>\n  var scale = new THREE.Vector3(1,2,1);\n  THREEx.GeometryUtils.scale(geometry, scale);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <h2>Translate</h2>\n\n<p>To make the geometry move 100 further in <code>x</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p><code>\n  var translation = new THREE.Vector3(100,0,0);\n  THREEx.GeometryUtils.translate(geometry, translation);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <h2>Center</h2>\n\n<p>To center the geometry on its middle point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.center(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <h2>middlePoint</h2>\n\n<p>To compute the middle point of a geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p><code>\n  THREEx.GeometryUtils.middlePoint(geometry);\n</code></p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>TODO\n- chained API\n- possibility a matrix to reduce computation ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Change the scale of a geometry</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} geometry the geometry to compute on</span>\n<span class=\"cm\"> * @params {THREE.Vector3} scale the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">scale</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">scale</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">multiplySelf</span><span class=\"p\">(</span><span class=\"nx\">scale</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">translate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>change all geometry.vertices</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">addSelf</span><span class=\"p\">(</span><span class=\"nx\">delta</span><span class=\"p\">);</span> \n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>mark the vertices as dirty</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return this, to get chained API    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Compute the &quot;middlePoint&quot; aka the point at the middle of the boundingBox</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @params {THREE.Geometry} the geometry to compute on</span>\n<span class=\"cm\"> * @returns {THREE.Vector3} the middlepoint of the geometry</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>compute middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">middle</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">()</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span>\n\t<span class=\"nx\">middle</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>return the just computed middle</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">middle</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Center the geometry on its middlepoint</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">center</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">noX</span><span class=\"p\">,</span> <span class=\"nx\">noY</span><span class=\"p\">,</span> <span class=\"nx\">noZ</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>compute delta</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">middlePoint</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">).</span><span class=\"nx\">negate</span><span class=\"p\">();</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noX</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noY</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">y</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">noZ</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span><span class=\"p\">.</span><span class=\"nx\">z</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Initial version of attachement</span>\n<span class=\"cm\"> * - geometry2 is the one which is moved</span>\n<span class=\"cm\"> * - TODO make something more flexible... especially on the attachement config</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryUtils</span><span class=\"p\">.</span><span class=\"nx\">attachRightLeft</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry1</span><span class=\"p\">,</span> <span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">delta</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">delta</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">delta</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-22\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>               </div>               <p>compute bounding box</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t<span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">computeBoundingBox</span><span class=\"p\">();</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">maxX1</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry1</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">1</span> <span class=\"p\">]</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">minX2</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry2</span><span class=\"p\">.</span><span class=\"nx\">boundingBox</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">[</span> <span class=\"mi\">0</span> <span class=\"p\">];</span>\n\n\t<span class=\"kd\">var</span> <span class=\"nx\">vector</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">();</span>\n\t<span class=\"nx\">vector</span><span class=\"p\">.</span><span class=\"nx\">x</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxX1</span><span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">minX2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">delta</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">translate</span><span class=\"p\">(</span><span class=\"nx\">geometry2</span><span class=\"p\">,</span> <span class=\"nx\">vector</span><span class=\"p\">);</span>\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.GeometryWobble.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.GeometryWobble.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.GeometryWobble.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>Geometry Wobble\nbased on paul lewis / areotwist - http://lab.aerotwist.com/webgl/undulating-monkey/</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">init</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">().</span><span class=\"nx\">normalize</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span>\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">dynamic</span>\t<span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">cpuAxis</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">type</span><span class=\"p\">,</span> <span class=\"nx\">factor</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">type</span>\t<span class=\"o\">=</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">factor</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">factor</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>Note: may need more axis ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;x&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">type</span> <span class=\"o\">===</span> <span class=\"s1\">&#39;z&#39;</span> <span class=\"p\">)</span>\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span>\t<span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">factor</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">else</span>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">GeometryWobble</span><span class=\"p\">.</span><span class=\"nx\">Animate</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">phase</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">phase</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">phase</span>\t\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"kc\">undefined</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n\t\n\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">magnitude</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;number&quot;</span> <span class=\"p\">)</span>\t<span class=\"nx\">magnitude</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector3</span><span class=\"p\">(</span><span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">,</span> <span class=\"nx\">magnitude</span><span class=\"p\">)</span>\n\n\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertex</span>\t<span class=\"o\">=</span> <span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">vertices</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">vertexPhase</span>\t<span class=\"o\">=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"nx\">phase</span> <span class=\"o\">+</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">axisValue</span><span class=\"p\">);</span>\n\t\t\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">x</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">y</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">position</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">=</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">originalPosition</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">+</span> <span class=\"nx\">vertexPhase</span> <span class=\"o\">*</span> <span class=\"nx\">vertex</span><span class=\"p\">.</span><span class=\"nx\">dirVector</span><span class=\"p\">.</span><span class=\"nx\">z</span> <span class=\"o\">*</span> <span class=\"nx\">magnitude</span><span class=\"p\">.</span><span class=\"nx\">z</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">geometry</span><span class=\"p\">.</span><span class=\"nx\">__dirtyVertices</span> <span class=\"o\">=</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.KeyboardState.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.KeyboardState.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.KeyboardState.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>THREEx.KeyboardState.js keep the current state of the keyboard.\nIt is possible to query it at any time. No need of an event.\nThis is particularly convenient in loop driven case, like in\n3D demos or games.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Create the object</p>\n\n<p><code>var keyboard    = new THREEx.KeyboardState();</code></p>\n\n<p><strong>Step 2</strong>: Query the keyboard state</p>\n\n<p>This will return true if shift and A are pressed, false otherwise</p>\n\n<p><code>keyboard.pressed(\"shift+A\")</code></p>\n\n<p><strong>Step 3</strong>: Stop listening to the keyboard</p>\n\n<p><code>keyboard.destroy()</code></p>\n\n<p>NOTE: this library may be nice as standaline. independant from three.js\n- rename it keyboardForGame</p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * - NOTE: it would be quite easy to push event-driven too</span>\n<span class=\"cm\"> *   - microevent.js for events handling</span>\n<span class=\"cm\"> *   - in this._onkeyChange, generate a string from the DOM event</span>\n<span class=\"cm\"> *   - use this as event name</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>to store the current state</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>create callback to bind/unbind keyboard events</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">self</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span> <span class=\"p\">};</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span> <span class=\"nx\">self</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);};</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>bind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * To stop listening of the keyboard events</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">destroy</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>unbind keyEvents</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keydown&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyDown</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;keyup&quot;</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_onKeyUp</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">];</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"s1\">&#39;left&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">37</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;up&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">38</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;right&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">39</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;down&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">40</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;space&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">32</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pageup&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">33</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;pagedown&#39;</span>\t<span class=\"o\">:</span> <span class=\"mi\">34</span><span class=\"p\">,</span>\n\t<span class=\"s1\">&#39;tab&#39;</span>\t\t<span class=\"o\">:</span> <span class=\"mi\">9</span>\n<span class=\"p\">};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * to process the keyboard dom event</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">_onKeyChange</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">,</span> <span class=\"nx\">pressed</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>log to debug\nconsole.log(\"onKeyChange\", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>update this.keyCodes</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">keyCode</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">keyCode</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">keyCode</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>update this.modifiers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;shift&#39;</span><span class=\"p\">]</span><span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">shiftKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;ctrl&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">ctrlKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;alt&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">altKey</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"s1\">&#39;meta&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">metaKey</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * query keyboard state to know if a key is pressed of not</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A</span>\n<span class=\"cm\"> * @returns {Boolean} true if the key is pressed, false otherwise</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">keyDesc</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">keys</span>\t<span class=\"o\">=</span> <span class=\"nx\">keyDesc</span><span class=\"p\">.</span><span class=\"nx\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;+&quot;</span><span class=\"p\">);</span>\n\t<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;</span> <span class=\"nx\">keys</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span><span class=\"p\">){</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">key</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">keys</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">];</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">pressed</span><span class=\"p\">;</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">MODIFIERS</span><span class=\"p\">.</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">modifiers</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">keys</span><span class=\"p\">(</span><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">).</span><span class=\"nx\">indexOf</span><span class=\"p\">(</span> <span class=\"nx\">key</span> <span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">){</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">KeyboardState</span><span class=\"p\">.</span><span class=\"nx\">ALIAS</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">];</span>\n\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">pressed</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">keyCodes</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">.</span><span class=\"nx\">toUpperCase</span><span class=\"p\">().</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n\t\t<span class=\"p\">}</span>\n\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nx\">pressed</span><span class=\"p\">)</span>\t<span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"p\">;</span>\n\t<span class=\"p\">};</span>\n\t<span class=\"k\">return</span> <span class=\"kc\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.LogoTurtle.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.LogoTurtle.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.LogoTurtle.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO should those relative polar coord function be INSIDE path already ?</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span>\t<span class=\"o\">=</span> <span class=\"p\">[];</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">create</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">turn</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">rotation</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span>\t<span class=\"o\">+=</span> <span class=\"nx\">rotation</span><span class=\"p\">;</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">moveTo</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">=</span> <span class=\"nx\">x</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nx\">y</span> <span class=\"o\">*</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">);</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">forward</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">distance</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">cos</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span>\t<span class=\"o\">+=</span> <span class=\"nb\">Math</span><span class=\"p\">.</span><span class=\"nx\">sin</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_angle</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"nx\">distance</span><span class=\"p\">;</span>\n\n\t<span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">.</span><span class=\"nx\">push</span><span class=\"p\">(</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Vector2</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penX</span><span class=\"p\">,</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_penY</span><span class=\"p\">)</span> <span class=\"p\">);</span>\t\n\t\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">LogoTurtle</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">.</span><span class=\"nx\">points</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">()</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">_vectors</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.PlasmaShader.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.PlasmaShader.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.PlasmaShader.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>define namespaces</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span>\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">UniformsLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">time</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">scale</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">rotation</span><span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">0.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">opacity</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">1.0</span> <span class=\"p\">},</span>\n\n\t<span class=\"nx\">c0</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">5.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c1</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c2</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span> <span class=\"mf\">11.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c3</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">7.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c4</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">9.0</span> <span class=\"p\">},</span>\n\t<span class=\"nx\">c5</span>\t<span class=\"o\">:</span> <span class=\"p\">{</span> <span class=\"nx\">type</span> <span class=\"o\">:</span> <span class=\"s2\">&quot;f&quot;</span><span class=\"p\">,</span> <span class=\"nx\">value</span><span class=\"o\">:</span>  <span class=\"mf\">3.0</span> <span class=\"p\">}</span>\t\n<span class=\"p\">};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">ShaderLib</span><span class=\"p\">[</span><span class=\"s1\">&#39;plasma&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t<span class=\"nx\">vertexShader</span><span class=\"o\">:</span>\t<span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vUv\t= uv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">),</span>\n\t<span class=\"nx\">fragmentShader</span><span class=\"o\">:</span> <span class=\"p\">[</span>\n\t\t<span class=\"s2\">&quot;#ifdef GL_ES&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;precision highp float;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;varying vec2 vUv;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float time;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float scale;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float rotation;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float opacity;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;uniform float c0, c1, c2, c3, c4, c5;&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>todo zoom and rotation of vec2 point</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec2 rotoZoom(const vec2 point, const float scale, const float rotation){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 tmp;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.x\t\t= point.x * cos(rotation) - point.y * sin(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp.y\t\t= point.x * sin(rotation) + point.y * cos(rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;tmp\t\t= tmp * scale;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;return tmp;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span>\n\t\t</pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>based on THREE.Color.setHSV()\nbased on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;vec3 HSVtoRGB(const vec3 color){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float h\t= color.r;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float s\t= color.g;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float v\t= color.b;&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float i\t= floor(h * 6.0);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float f\t= (h * 6.0) - i;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float p\t= v * (1.0 - s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float q\t= v * (1.0 - f * s);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float t\t= v * (1.0 - (1.0 - f) * s);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;vec3 result;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;if( i &lt; 1.0 )\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 2.0 )\tresult = vec3(q,v,p);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 3.0 )\tresult = vec3(p,v,t);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 4.0 )\tresult = vec3(p,q,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 5.0 )\tresult = vec3(t,p,v);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else if( i &lt; 6.0 )\tresult = vec3(v,p,q);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;else \t\t\tresult = vec3(v,t,p);&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;return result;&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;}&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>default value</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;#ifndef ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define ROTOZOOM 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#ifndef USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#define USEHSV 1&quot;</span><span class=\"p\">,</span>\n\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\t\t\n\t\t<span class=\"s2\">&quot;void main(){&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;vec2 p\t\t= -1.0 + 2.0 * vUv;&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#if ROTOZOOM&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;p \t= rotoZoom(p, scale, rotation);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;float cossin1\t= cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin2\t= cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;float cossin3\t= cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>\"vec3 color    = vec3(abs(cossin1<em>sin(p.x)), cossin2</em>sin(p.y), cossin3*sin(p.x));\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"s2\">&quot;vec3 color\t= vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;#if USEHSV&quot;</span><span class=\"p\">,</span>\n\t\t\t\t<span class=\"s2\">&quot;color\t= HSVtoRGB(color);&quot;</span><span class=\"p\">,</span>\n\t\t\t<span class=\"s2\">&quot;#endif&quot;</span><span class=\"p\">,</span>\n\n\t\t\t<span class=\"s2\">&quot;gl_FragColor\t= vec4(color, opacity);&quot;</span><span class=\"p\">,</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>\"gl_FragColor    = vec4(cossin1<em>sin(p.x), cossin2</em>sin(p.y), cossin3*sin(p.x), opacity);\",</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"s2\">&quot;}&quot;</span>\n\t<span class=\"p\">].</span><span class=\"nx\">join</span><span class=\"p\">(</span> <span class=\"s2\">&quot;\\n&quot;</span> <span class=\"p\">)</span>\n<span class=\"p\">};</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.SkyMap.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.SkyMap.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.SkyMap.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> <span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">buildMesh</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">urls</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>get parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span> <span class=\"o\">||</span> <span class=\"p\">{}</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">cubeSize</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span> <span class=\"o\">!==</span> <span class=\"kc\">undefined</span> <span class=\"o\">?</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">cubeSize</span>\t<span class=\"o\">:</span> <span class=\"mi\">100000</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>load the cube textures</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">texture</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ImageUtils</span><span class=\"p\">.</span><span class=\"nx\">loadTextureCube</span><span class=\"p\">(</span> <span class=\"nx\">urls</span> <span class=\"p\">);</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>init the cube shadder</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">shader</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">ShaderUtils</span><span class=\"p\">.</span><span class=\"nx\">lib</span><span class=\"p\">[</span><span class=\"s2\">&quot;cube&quot;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">uniforms</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">UniformsUtils</span><span class=\"p\">.</span><span class=\"nx\">clone</span><span class=\"p\">(</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">uniforms</span> <span class=\"p\">);</span>\n\t<span class=\"nx\">uniforms</span><span class=\"p\">[</span><span class=\"s1\">&#39;tCube&#39;</span><span class=\"p\">].</span><span class=\"nx\">texture</span><span class=\"o\">=</span> <span class=\"nx\">textureCube</span><span class=\"p\">;</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">material</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">MeshShaderMaterial</span><span class=\"p\">({</span>\n\t\t<span class=\"nx\">fragmentShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">fragmentShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">vertexShader</span>\t<span class=\"o\">:</span> <span class=\"nx\">shader</span><span class=\"p\">.</span><span class=\"nx\">vertexShader</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">uniforms</span>\t<span class=\"o\">:</span> <span class=\"nx\">uniforms</span>\n\t<span class=\"p\">});</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>build the geometry</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">geometry</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">CubeGeometry</span><span class=\"p\">(</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"nx\">cubeSize</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"kc\">null</span><span class=\"p\">,</span> <span class=\"kc\">true</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>build the skybox Mesh</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">mesh</span>\t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">THREE</span><span class=\"p\">.</span><span class=\"nx\">Mesh</span><span class=\"p\">(</span> <span class=\"nx\">geometry</span><span class=\"p\">,</span> <span class=\"nx\">material</span> <span class=\"p\">);</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">mesh</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPosx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negy&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;posz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;negz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Build the urls array for THREEx.SkyMap.buildMesh()</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">SkyMap</span><span class=\"p\">.</span><span class=\"nx\">UrlsPx</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">prefix</span><span class=\"p\">,</span> <span class=\"nx\">extension</span><span class=\"p\">)</span>\n<span class=\"p\">{</span>\n\t<span class=\"k\">return</span> <span class=\"p\">[</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;px&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nx&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;py&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;ny&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;pz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">prefix</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;nz&quot;</span> <span class=\"o\">+</span> <span class=\"nx\">extension</span>\n\t<span class=\"p\">];</span>\n\t<span class=\"k\">return</span> <span class=\"nx\">urls</span><span class=\"p\">;</span>\t\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.WindowResize.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.WindowResize.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.WindowResize.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>               <p>This THREEx helper makes it easy to handle window resize.\nIt will update renderer and camera when window is resized.</p>\n\n<h1>Usage</h1>\n\n<p><strong>Step 1</strong>: Start updating renderer and camera</p>\n\n<p><code>var windowResize = THREEx.WindowResize(aRenderer, aCamera)</code></p>\n\n<p><strong>Step 2</strong>: Start updating renderer and camera</p>\n\n<p><code>windowResize.stop()</code></p>\n\n<h1>Code</h1>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span>\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * Update renderer and camera when the window is resized</span>\n<span class=\"cm\"> * </span>\n<span class=\"cm\"> * @param {Object} renderer the renderer to update</span>\n<span class=\"cm\"> * @param {Object} Camera the camera to update</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">WindowResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">camera</span><span class=\"p\">){</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>notify the renderer of the size change</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">setSize</span><span class=\"p\">(</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span><span class=\"p\">,</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span> <span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>update the camera</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">aspect</span>\t<span class=\"o\">=</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerWidth</span> <span class=\"o\">/</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">innerHeight</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">camera</span><span class=\"p\">.</span><span class=\"nx\">updateProjectionMatrix</span><span class=\"p\">();</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>bind the resize event</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>return .stop() the function to stop watching window resize</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t\t * Stop watching window resize</span>\n<span class=\"cm\">\t\t*/</span>\n\t\t<span class=\"nx\">stop</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;resize&#39;</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.glCapability.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.glCapability.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.glCapability.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Define namespace</span>\n<span class=\"cm\">*/</span>\n<span class=\"k\">if</span><span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">THREEx</span> <span class=\"o\">===</span> <span class=\"s2\">&quot;undefined&quot;</span><span class=\"p\">)</span>\t<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\n\n<span class=\"cm\">/**</span>\n<span class=\"cm\"> * return the capability of a WebGl context</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * TODO to rewrite</span>\n<span class=\"cm\"> * - heavily wased on webglreport on sourceforge</span>\n<span class=\"cm\"> * - is there other/better properties</span>\n<span class=\"cm\"> * - should i get a more readable output ?</span>\n<span class=\"cm\"> *   - another function ?</span>\n<span class=\"cm\"> *</span>\n<span class=\"cm\"> * @param {WebGLRenderingContext} webgl context</span>\n<span class=\"cm\"> * @returns {Object} capabilities</span>\n<span class=\"cm\">*/</span>\n<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">glCapability</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">)</span>\n<span class=\"p\">{</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>sanity check - gl context MUST BE WebGLRenderingContext</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">assert</span><span class=\"p\">(</span><span class=\"nx\">gl</span> <span class=\"k\">instanceof</span> <span class=\"nx\">WebGLRenderingContext</span><span class=\"p\">)</span></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>TODO find better names</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"kd\">var</span> <span class=\"nx\">prout</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SHADING_LANGUAGE_VERSION&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;VENDOR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;RENDERER&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">pixDepth</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;RED_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;GREEN_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;BLUE_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALPHA_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;DEPTH_BITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;STENCIL_BITS&#39;</span><span class=\"p\">];</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">slota</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;MAX_RENDERBUFFER_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_COMBINED_TEXTURE_IMAGE_UNITS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_CUBE_MAP_TEXTURE_SIZE&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_FRAGMENT_UNIFORM_VECTORS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_TEXTURE_SIZE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_ATTRIBS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_TEXTURE_IMAGE_UNITS&#39;</span>\n\t\t\t\t<span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VERTEX_UNIFORM_VECTORS&#39;</span><span class=\"p\">];</span>\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">sloti</span>\t<span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ALIASED_LINE_WIDTH_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ALIASED_POINT_SIZE_RANGE&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;MAX_VIEWPORT_DIMS&#39;</span><span class=\"p\">];</span>\n\t\n\t<span class=\"kd\">var</span> <span class=\"nx\">info</span>\t<span class=\"o\">=</span> <span class=\"p\">{};</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">collect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">arr</span><span class=\"p\">){</span>\n\t\t<span class=\"nx\">arr</span><span class=\"p\">.</span><span class=\"nx\">forEach</span><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">parameter</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>console.log('parameter', parameter)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getParameter</span><span class=\"p\">(</span><span class=\"nx\">gl</span><span class=\"p\">[</span><span class=\"nx\">parameter</span><span class=\"p\">])</span>\n\t\t<span class=\"p\">})</span>\n\t<span class=\"p\">}</span>\n\t\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">prout</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">pixDepth</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">slota</span><span class=\"p\">);</span>\n\t<span class=\"nx\">collect</span><span class=\"p\">(</span><span class=\"nx\">sloti</span><span class=\"p\">)</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>special case to get the extensions</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">info</span><span class=\"p\">[</span><span class=\"s1\">&#39;SUPPORTED_EXTENSIONS&#39;</span><span class=\"p\">]</span>\t<span class=\"o\">=</span> <span class=\"nx\">gl</span><span class=\"p\">.</span><span class=\"nx\">getSupportedExtensions</span><span class=\"p\">()</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>console.log(\"info\");\nconsole.dir(info)</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"k\">return</span> <span class=\"nx\">info</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.requestAnimationFrame.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.requestAnimationFrame.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.requestAnimationFrame.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/**</span>\n<span class=\"cm\"> * Provides requestAnimationFrame/cancelRequestAnimation in a cross browser way.</span>\n<span class=\"cm\"> * from paul irish + jerome etienne</span>\n<span class=\"cm\"> * - http://paulirish.com/2011/requestanimationframe-for-smart-animating/</span>\n<span class=\"cm\"> * - http://notes.jetienne.com/2011/05/18/cancelRequestAnimFrame-for-paul-irish-requestAnimFrame.html</span>\n<span class=\"cm\"> */</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">requestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"kd\">function</span><span class=\"p\">(</span> <span class=\"cm\">/* function FrameRequestCallback */</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"cm\">/* DOMElement Element */</span> <span class=\"nx\">element</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">setTimeout</span><span class=\"p\">(</span> <span class=\"nx\">callback</span><span class=\"p\">,</span> <span class=\"mi\">1000</span> <span class=\"o\">/</span> <span class=\"mi\">60</span> <span class=\"p\">);</span>\n\n\t\t<span class=\"p\">};</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n<span class=\"k\">if</span> <span class=\"p\">(</span> <span class=\"o\">!</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"p\">)</span> <span class=\"p\">{</span>\n\n\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">cancelRequestAnimationFrame</span> <span class=\"o\">=</span> <span class=\"p\">(</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">webkitCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">mozCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">oCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">msCancelRequestAnimationFrame</span> <span class=\"o\">||</span>\n\t\t<span class=\"nx\">clearTimeout</span>\n\n\t<span class=\"p\">}</span> <span class=\"p\">)();</span>\n\n<span class=\"p\">}</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/THREEx.screenshot.html",
    "content": "<!DOCTYPE html>  <html> <head>   <title>THREEx.screenshot.js</title>   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">   <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" /> </head> <body>   <div id=\"container\">     <div id=\"background\"></div>            <div id=\"jump_to\">         Jump To &hellip;         <div id=\"jump_wrapper\">           <div id=\"jump_page\">                                           <a class=\"source\" href=\"THREEx.CelShader.html\">                 THREEx.CelShader.js               </a>                                           <a class=\"source\" href=\"THREEx.DeviceOrientationState.html\">                 THREEx.DeviceOrientationState.js               </a>                                           <a class=\"source\" href=\"THREEx.FullScreen.html\">                 THREEx.FullScreen.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryUtils.html\">                 THREEx.GeometryUtils.js               </a>                                           <a class=\"source\" href=\"THREEx.GeometryWobble.html\">                 THREEx.GeometryWobble.js               </a>                                           <a class=\"source\" href=\"THREEx.KeyboardState.html\">                 THREEx.KeyboardState.js               </a>                                           <a class=\"source\" href=\"THREEx.LogoTurtle.html\">                 THREEx.LogoTurtle.js               </a>                                           <a class=\"source\" href=\"THREEx.PlasmaShader.html\">                 THREEx.PlasmaShader.js               </a>                                           <a class=\"source\" href=\"THREEx.SkyMap.html\">                 THREEx.SkyMap.js               </a>                                           <a class=\"source\" href=\"THREEx.WindowResize.html\">                 THREEx.WindowResize.js               </a>                                           <a class=\"source\" href=\"THREEx.glCapability.html\">                 THREEx.glCapability.js               </a>                                           <a class=\"source\" href=\"THREEx.requestAnimationFrame.html\">                 THREEx.requestAnimationFrame.js               </a>                                           <a class=\"source\" href=\"THREEx.screenshot.html\">                 THREEx.screenshot.js               </a>                                           <a class=\"source\" href=\"threex.embedded.html\">                 threex.embedded.js               </a>                        </div>         </div>       </div>          <table cellpadding=\"0\" cellspacing=\"0\">       <thead>         <tr>           <th class=\"docs\">             <h1>               THREEx.screenshot.js             </h1>           </th>           <th class=\"code\">           </th>         </tr>       </thead>       <tbody>                               <tr id=\"section-1\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>               </div>                            </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"cm\">/** @namespace */</span>\n<span class=\"kd\">var</span> <span class=\"nx\">THREEx</span>\t<span class=\"o\">=</span> <span class=\"nx\">THREEx</span> \t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-2\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>               </div>               <p>TODO http://29a.ch/2011/9/11/uploading-from-html5-canvas-to-imgur-data-uri\nable to upload your screenshot without running servers</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre></pre></div>             </td>           </tr>                               <tr id=\"section-3\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>               </div>               <p>forced closure</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre><span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">(){</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Take a screenshot of a renderer</span>\n<span class=\"cm\">\t * - require WebGLRenderer to have &quot;preserveDrawingBuffer: true&quot; to be set</span>\n<span class=\"cm\">\t * - TODO is it possible to check if this variable is set ? if so check it</span>\n<span class=\"cm\">\t *   and make advice in the console.log</span>\n<span class=\"cm\">\t *   - maybe with direct access to the gl context...</span>\n<span class=\"cm\">\t * </span>\n<span class=\"cm\">\t * @param {Object} renderer to use</span>\n<span class=\"cm\">\t * @param {String} mimetype of the output image. default to &quot;image/png&quot;</span>\n<span class=\"cm\">\t * @param {String} dataUrl of the image</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">toDataURL</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">mimetype</span><span class=\"p\">)</span>\n\t<span class=\"p\">{</span>\n\t\t<span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">||</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">renderer</span><span class=\"p\">.</span><span class=\"nx\">domElement</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span>\n\t\t<span class=\"k\">return</span> <span class=\"nx\">dataUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\n\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * resize an image to another resolution while preserving aspect</span>\n<span class=\"cm\">\t *</span>\n<span class=\"cm\">\t * @param {String} srcUrl the url of the image to resize</span>\n<span class=\"cm\">\t * @param {Number} dstWidth the destination width of the image</span>\n<span class=\"cm\">\t * @param {Number} dstHeight the destination height of the image</span>\n<span class=\"cm\">\t * @param {Number} callback the callback to notify once completed with callback(newImageUrl)</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">_aspectResize</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">srcUrl</span><span class=\"p\">,</span> <span class=\"nx\">dstW</span><span class=\"p\">,</span> <span class=\"nx\">dstH</span><span class=\"p\">,</span> <span class=\"nx\">callback</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-4\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>               </div>               <p>to compute the width/height while keeping aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">cpuScaleAspect</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">maxW</span><span class=\"p\">,</span> <span class=\"nx\">maxH</span><span class=\"p\">,</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">curH</span><span class=\"p\">){</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ratio</span>\t<span class=\"o\">=</span> <span class=\"nx\">curH</span> <span class=\"o\">/</span> <span class=\"nx\">curW</span><span class=\"p\">;</span>\n\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">curW</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxW</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">ratio</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">1</span> <span class=\"p\">){</span> \n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxW</span> <span class=\"o\">*</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span><span class=\"k\">else</span> <span class=\"k\">if</span><span class=\"p\">(</span><span class=\"nx\">curH</span> <span class=\"o\">&gt;=</span> <span class=\"nx\">maxH</span><span class=\"p\">){</span>\n\t\t\t\t<span class=\"nx\">curH</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span><span class=\"p\">;</span>\n\t\t\t\t<span class=\"nx\">curW</span>\t<span class=\"o\">=</span> <span class=\"nx\">maxH</span> <span class=\"o\">/</span> <span class=\"nx\">ratio</span><span class=\"p\">;</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t\t<span class=\"k\">return</span> <span class=\"p\">{</span> <span class=\"nx\">width</span><span class=\"o\">:</span> <span class=\"nx\">curW</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"o\">:</span> <span class=\"nx\">curH</span> <span class=\"p\">};</span>\n\t\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-5\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>               </div>               <p>callback once the image is loaded</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onLoad</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(){</span></pre></div>             </td>           </tr>                               <tr id=\"section-6\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>               </div>               <p>init the canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">canvas</span>\t<span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;canvas&#39;</span><span class=\"p\">);</span>\n\t\t\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstW</span><span class=\"p\">;</span>\t<span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">dstH</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">ctx</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">getContext</span><span class=\"p\">(</span><span class=\"s1\">&#39;2d&#39;</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-7\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>               </div>               <p>TODO is this needed</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillStyle</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;black&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">fillRect</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-8\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>               </div>               <p>scale the image while preserving the aspect</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">scaled</span>\t<span class=\"o\">=</span> <span class=\"nx\">cpuScaleAspect</span><span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-9\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>               </div>               <p>actually draw the image on canvas</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetX</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">width</span>  <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">offsetY</span>\t<span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">height</span> <span class=\"o\">-</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\t\t\t<span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nx\">drawImage</span><span class=\"p\">(</span><span class=\"nx\">image</span><span class=\"p\">,</span> <span class=\"nx\">offsetX</span><span class=\"p\">,</span> <span class=\"nx\">offsetY</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">scaled</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-10\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>               </div>               <p>dump the canvas to an URL        </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">mimetype</span>\t<span class=\"o\">=</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">;</span>\n\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">newDataUrl</span>\t<span class=\"o\">=</span> <span class=\"nx\">canvas</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">mimetype</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-11\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>               </div>               <p>notify the url to the caller</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">callback</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">callback</span><span class=\"p\">(</span><span class=\"nx\">newDataUrl</span><span class=\"p\">)</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-12\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>               </div>               <p>Create new Image object</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">image</span> \t<span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nx\">Image</span><span class=\"p\">();</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">onload</span>\t<span class=\"o\">=</span> <span class=\"nx\">onLoad</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">image</span><span class=\"p\">.</span><span class=\"nx\">src</span>\t<span class=\"o\">=</span> <span class=\"nx\">srcUrl</span><span class=\"p\">;</span>\n\t<span class=\"p\">}</span>\n\t</pre></div>             </td>           </tr>                               <tr id=\"section-13\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>               </div>               <p>Super cooked function: THREEx.Screenshot.bindKey(renderer)\nand you are done to get screenshot on your demo</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"cm\">/**</span>\n<span class=\"cm\">\t * Bind a key to renderer screenshot</span>\n<span class=\"cm\">\t*/</span>\n\t<span class=\"kd\">var</span> <span class=\"nx\">bindKey</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-14\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>               </div>               <p>handle parameters</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span>\t\t<span class=\"o\">=</span> <span class=\"nx\">opts</span>\t\t<span class=\"o\">||</span> <span class=\"p\">{};</span></pre></div>             </td>           </tr>                               <tr id=\"section-15\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>               </div>               <p>FIXME this modification of opts parameters is a bug. remove it</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span>\t<span class=\"o\">||</span> <span class=\"s1\">&#39;p&#39;</span><span class=\"p\">.</span><span class=\"nx\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">);</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span>\t<span class=\"o\">||</span> <span class=\"mi\">640</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span>\t<span class=\"o\">||</span> <span class=\"mi\">480</span><span class=\"p\">;</span>\n\t\t<span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">=</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span>\t<span class=\"o\">||</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">){</span>\n\t\t\t<span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">open</span><span class=\"p\">(</span><span class=\"nx\">url</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">};</span></pre></div>             </td>           </tr>                               <tr id=\"section-16\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>               </div>               <p>callback to handle keypress</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"kd\">var</span> <span class=\"nx\">onKeyPress</span>\t<span class=\"o\">=</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">event</span><span class=\"p\">){</span></pre></div>             </td>           </tr>                               <tr id=\"section-17\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>               </div>               <p>return now if the KeyPress isnt for the proper charCode</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"k\">if</span><span class=\"p\">(</span> <span class=\"nx\">event</span><span class=\"p\">.</span><span class=\"nx\">which</span> <span class=\"o\">!==</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">charCode</span> <span class=\"p\">)</span>\t<span class=\"k\">return</span><span class=\"p\">;</span></pre></div>             </td>           </tr>                               <tr id=\"section-18\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>               </div>               <p>get the renderer output</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"kd\">var</span> <span class=\"nx\">dataUrl</span>\t<span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">toDataURL</span><span class=\"p\">(</span><span class=\"nx\">renderer</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-19\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>               </div>               <p>FIXME dont resize if not explicitly asked\n* resize == async so if callback is a window open, it triggers the pop blocker\nresize it and notify the callback</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t\t<span class=\"nx\">_aspectResize</span><span class=\"p\">(</span><span class=\"nx\">dataUrl</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">height</span><span class=\"p\">,</span> <span class=\"nx\">opts</span><span class=\"p\">.</span><span class=\"nx\">callback</span><span class=\"p\">);</span>\n\t\t<span class=\"p\">}.</span><span class=\"nx\">bind</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">);</span></pre></div>             </td>           </tr>                               <tr id=\"section-20\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>               </div>               <p>listen to keypress\nNOTE: for firefox it seems mandatory to listen to document directly</p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\n\t\t<span class=\"k\">return</span> <span class=\"p\">{</span>\n\t\t\t<span class=\"nx\">unbind</span>\t<span class=\"o\">:</span> <span class=\"kd\">function</span><span class=\"p\">(){</span>\n\t\t\t\t<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">removeEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;keypress&#39;</span><span class=\"p\">,</span> <span class=\"nx\">onKeyPress</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">);</span>\n\t\t\t<span class=\"p\">}</span>\n\t\t<span class=\"p\">};</span>\n\t<span class=\"p\">}</span></pre></div>             </td>           </tr>                               <tr id=\"section-21\">             <td class=\"docs\">               <div class=\"pilwrap\">                 <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>               </div>               <p>export it    </p>             </td>             <td class=\"code\">               <div class=\"highlight\"><pre>\t<span class=\"nx\">THREEx</span><span class=\"p\">.</span><span class=\"nx\">Screenshot</span>\t<span class=\"o\">=</span> <span class=\"p\">{</span>\n\t\t<span class=\"nx\">toDataURL</span>\t<span class=\"o\">:</span> <span class=\"nx\">toDataURL</span><span class=\"p\">,</span>\n\t\t<span class=\"nx\">bindKey</span>\t\t<span class=\"o\">:</span> <span class=\"nx\">bindKey</span>\n\t<span class=\"p\">};</span>\n<span class=\"p\">})();</span>\n\n</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> "
  },
  {
    "path": "TJunctions/vendor/threex/docs/docco.css",
    "content": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;\n  font-size: 15px;\n  line-height: 22px;\n  color: #252519;\n  margin: 0; padding: 0;\n}\na {\n  color: #261a3b;\n}\n  a:visited {\n    color: #261a3b;\n  }\np {\n  margin: 0 0 15px 0;\n}\nh1, h2, h3, h4, h5, h6 {\n  margin: 0px 0 15px 0;\n}\n  h1 {\n    margin-top: 40px;\n  }\n#container {\n  position: relative;\n}\n#background {\n  position: fixed;\n  top: 0; left: 525px; right: 0; bottom: 0;\n  background: #f5f5ff;\n  border-left: 1px solid #e5e5ee;\n  z-index: -1;\n}\n#jump_to, #jump_page {\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 10px Arial;\n  text-transform: uppercase;\n  cursor: pointer;\n  text-align: right;\n}\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 5px 10px;\n}\n  #jump_wrapper {\n    padding: 0;\n    display: none;\n  }\n    #jump_to:hover #jump_wrapper {\n      display: block;\n    }\n    #jump_page {\n      padding: 5px 0 3px;\n      margin: 0 0 25px 25px;\n    }\n      #jump_page .source {\n        display: block;\n        padding: 5px 10px;\n        text-decoration: none;\n        border-top: 1px solid #eee;\n      }\n        #jump_page .source:hover {\n          background: #f5f5ff;\n        }\n        #jump_page .source:first-child {\n        }\ntable td {\n  border: 0;\n  outline: 0;\n}\n  td.docs, th.docs {\n    max-width: 450px;\n    min-width: 450px;\n    min-height: 5px;\n    padding: 10px 25px 1px 50px;\n    overflow-x: hidden;\n    vertical-align: top;\n    text-align: left;\n  }\n    .docs pre {\n      margin: 15px 0 15px;\n      padding-left: 15px;\n    }\n    .docs p tt, .docs p code {\n      background: #f8f8ff;\n      border: 1px solid #dedede;\n      font-size: 12px;\n      padding: 0 0.2em;\n    }\n    .pilwrap {\n      position: relative;\n    }\n      .pilcrow {\n        font: 12px Arial;\n        text-decoration: none;\n        color: #454545;\n        position: absolute;\n        top: 3px; left: -20px;\n        padding: 1px 2px;\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n      }\n        td.docs:hover .pilcrow {\n          opacity: 1;\n        }\n  td.code, th.code {\n    padding: 14px 15px 16px 25px;\n    width: 100%;\n    vertical-align: top;\n    background: #f5f5ff;\n    border-left: 1px solid #e5e5ee;\n  }\n    pre, tt, code {\n      font-size: 12px; line-height: 18px;\n      font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n      margin: 0; padding: 0;\n    }\n\n\n/*---------------------- Syntax Highlighting -----------------------------*/\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\nbody .hll { background-color: #ffffcc }\nbody .c { color: #408080; font-style: italic }  /* Comment */\nbody .err { border: 1px solid #FF0000 }         /* Error */\nbody .k { color: #954121 }                      /* Keyword */\nbody .o { color: #666666 }                      /* Operator */\nbody .cm { color: #408080; font-style: italic } /* Comment.Multiline */\nbody .cp { color: #BC7A00 }                     /* Comment.Preproc */\nbody .c1 { color: #408080; font-style: italic } /* Comment.Single */\nbody .cs { color: #408080; font-style: italic } /* Comment.Special */\nbody .gd { color: #A00000 }                     /* Generic.Deleted */\nbody .ge { font-style: italic }                 /* Generic.Emph */\nbody .gr { color: #FF0000 }                     /* Generic.Error */\nbody .gh { color: #000080; font-weight: bold }  /* Generic.Heading */\nbody .gi { color: #00A000 }                     /* Generic.Inserted */\nbody .go { color: #808080 }                     /* Generic.Output */\nbody .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */\nbody .gs { font-weight: bold }                  /* Generic.Strong */\nbody .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */\nbody .gt { color: #0040D0 }                     /* Generic.Traceback */\nbody .kc { color: #954121 }                     /* Keyword.Constant */\nbody .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */\nbody .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */\nbody .kp { color: #954121 }                     /* Keyword.Pseudo */\nbody .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */\nbody .kt { color: #B00040 }                     /* Keyword.Type */\nbody .m { color: #666666 }                      /* Literal.Number */\nbody .s { color: #219161 }                      /* Literal.String */\nbody .na { color: #7D9029 }                     /* Name.Attribute */\nbody .nb { color: #954121 }                     /* Name.Builtin */\nbody .nc { color: #0000FF; font-weight: bold }  /* Name.Class */\nbody .no { color: #880000 }                     /* Name.Constant */\nbody .nd { color: #AA22FF }                     /* Name.Decorator */\nbody .ni { color: #999999; font-weight: bold }  /* Name.Entity */\nbody .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */\nbody .nf { color: #0000FF }                     /* Name.Function */\nbody .nl { color: #A0A000 }                     /* Name.Label */\nbody .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */\nbody .nt { color: #954121; font-weight: bold }  /* Name.Tag */\nbody .nv { color: #19469D }                     /* Name.Variable */\nbody .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */\nbody .w { color: #bbbbbb }                      /* Text.Whitespace */\nbody .mf { color: #666666 }                     /* Literal.Number.Float */\nbody .mh { color: #666666 }                     /* Literal.Number.Hex */\nbody .mi { color: #666666 }                     /* Literal.Number.Integer */\nbody .mo { color: #666666 }                     /* Literal.Number.Oct */\nbody .sb { color: #219161 }                     /* Literal.String.Backtick */\nbody .sc { color: #219161 }                     /* Literal.String.Char */\nbody .sd { color: #219161; font-style: italic } /* Literal.String.Doc */\nbody .s2 { color: #219161 }                     /* Literal.String.Double */\nbody .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */\nbody .sh { color: #219161 }                     /* Literal.String.Heredoc */\nbody .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */\nbody .sx { color: #954121 }                     /* Literal.String.Other */\nbody .sr { color: #BB6688 }                     /* Literal.String.Regex */\nbody .s1 { color: #219161 }                     /* Literal.String.Single */\nbody .ss { color: #19469D }                     /* Literal.String.Symbol */\nbody .bp { color: #954121 }                     /* Name.Builtin.Pseudo */\nbody .vc { color: #19469D }                     /* Name.Variable.Class */\nbody .vg { color: #19469D }                     /* Name.Variable.Global */\nbody .vi { color: #19469D }                     /* Name.Variable.Instance */\nbody .il { color: #666666 }                     /* Literal.Number.Integer.Long */"
  },
  {
    "path": "TJunctions/vendor/threex/examples/THREEx.DeviceOrientationState.html",
    "content": "<html>\n<body>\n\tangleX: <span id=\"angleX\"></span><br/>\n\tangleY: <span id=\"angleY\"></span><br/>\n\tangleZ: <span id=\"angleZ\"></span><br/>\n\t<script src=\"../THREEx.DeviceOrientationState.js\"></script>\n\t<script>\n\t\tvar deviceOrientation\t= new THREEx.DeviceOrientationState();\n\t\tvar elementX\t= document.getElementById('angleX');\n\t\tvar elementY\t= document.getElementById('angleY');\n\t\tvar elementZ\t= document.getElementById('angleZ');\n\t\tsetInterval(function(){\n\t\t\telementX.innerHTML\t= deviceOrientation.angleX();\n\t\t\telementY.innerHTML\t= deviceOrientation.angleY();\n\t\t\telementZ.innerHTML\t= deviceOrientation.angleZ();\n\t\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/THREEx.KeyboardState.html",
    "content": "<html>\n<body>\n\t<script src=\"../THREEx.KeyboardState.js\"></script>\n\t<script>\n\tvar keyboard\t= new THREEx.KeyboardState();\n\n\tsetInterval(function(){\n\t\tvar key\t\t= \"alt+left\";\n\t\tvar pressed\t= keyboard.pressed(key);\n\t\tconsole.log(\"key\", key, \"pressed\", pressed);\n\t}, 100);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/threex.embedded/noshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"noshield-iframe.html\"width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/threex.embedded/noshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus\t\t \t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITHOUT shielding events<br></span>\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span>\n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tNow <b>use arrow UP/DOWN</b> and the host page will scroll as events are not shielded.\n\t\t</span> \n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/threex.embedded/withshield-host.html",
    "content": "<html>\n\t<body>\n\t\t<iframe src=\"withshield-iframe.html\" width='320' height='240'></iframe>\n\n\t\t<div style=\"height:1024px; background-color: lightyellow\">\n\t\t\tdummy div 1024px height to create a scrollable page\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/threex.embedded/withshield-iframe.html",
    "content": "<html>\n\t<head>\n\t\t<style>\n\t\t\tbody .noFocusMessage\t\t{ display\t: block;\t}\n\t\t\tbody .withFocusMessage \t\t{ display\t: none;\t\t}\n\t\t\tbody:focus .noFocusMessage \t{ display\t: none;\t\t}\n\t\t\tbody:focus .withFocusMessage \t{ display\t: block;\t}\n\t\t\tbody \t\t\t\t{ background-color: #DC143C;\t}\n\t\t\tbody:focus \t\t\t{ background-color: lightgreen;\t}\n\t\t\tbody .title\t\t\t{ font-size\t: 120%;\t\t}\n\t\t</style>\n\t\t<script src=\"../../threex.embedded.js\"></script>\n\t</head>\n\t<body tabindex=1>\n\t\t<span class='title'>WITH shielding events<br></span>\n\t\t\n\t\t<span class=\"noFocusMessage\"><b>Click</b> to get focus</span> \n\t\t<span class=\"withFocusMessage\">\n\t\t\tGot Focus!<br>\n\t\t\tnow <b>use arrow UP/DOWN</b> and the host page won't scroll as events are shielded.\n\t\t</span> \n\t\t<script>\n\t\t\tif( THREEx.Embedded.inIFrame() ){\n\t\t\t\tTHREEx.Embedded.shieldArrowKeys();\n\t\t\t}\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/examples/threex.fullscreen.html",
    "content": "<html>\n<body>\n\t<h1>threex.fullscreen.js demo</h1>\n\t<a href=\"https://github.com/jeromeetienne/threex\">threex.js</a> - helpers for three.js\n\t<hr/>\n\t<!-- DOM declaration -->\n\t<span class=\"available\">fullscreen available ? <span class=\"value\"></span></span>\n\t<br/>\n\t<span class=\"activated\">fullscreen activated ? <span class=\"value\"></span></span>\n\t<br/>\n\t<button class=\"button request\">request fullscreen</button>\n\t<br/>\n\t<button class=\"button cancel\">cancel fullscreen</button>\n\n\t<script src=\"../threex.fullscreen.js\"></script>\n\n\t<script>\n\t\tdocument.querySelector(\".available .value\").innerHTML\t= THREEx.FullScreen.available() ? \"yes\" : \"no\";\n\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\n\t\tTHREEx.FullScreen.bindKey({\n\t\t\tdblclick\t: true\n\t\t});\n\t\t\n\t\tdocument.querySelector(\".button.request\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.request();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\n\t\tdocument.querySelector(\".button.cancel\").addEventListener('click', function(){\n\t\t\tTHREEx.FullScreen.cancel();\n\t\t\tdocument.querySelector(\".activated .value\").innerHTML\t= THREEx.FullScreen.activated() ? \"yes\" : \"no\";\n\t\t}, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "TJunctions/vendor/threex/threex.chromeWebStoreInstall.js",
    "content": "// This THREEx helper makes it easy to handle chrome.webstore.install API.\n// * api description http://code.google.com/chrome/webstore/docs/inline_installation.html \n// * paul kinlan post on g+ https://plus.google.com/116059998563577101552/posts/c9zYiA9RdC5\n// \n// # Code\n\n//\n\n\n/** @namespace */\nvar THREEx\t\t\t= THREEx \t\t\t|| {};\nTHREEx.ChromeWebStoreInstall\t= THREEx.ChromeWebStoreInstall\t|| {};\n\n/**\n * test if the API is available\n * @returns {Boolean} true if the API is available, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.apiAvailable\t= function()\n{\n\tvar available\t= typeof chrome !== 'undefined' && chrome.webstore && chrome.webstore.install;\n\treturn available ? true : false;\n}\n\n/**\n * Test if the application is already installed\n * \n * @returns {Boolean} true if the application is installed, false otherwise\n*/\nTHREEx.ChromeWebStoreInstall.isInstalled\t= function()\n{\n\tif( !this.apiAvailable() )\treturn false;\n\treturn chrome.app.isInstalled ? true : false;\n}\n\n/**\n * Trigger an installation\n * @param {String} url of the application (optional)\n * @param {Function} callback called if installation succeed\n * @param {Function} callback called if installation failed\n*/\nTHREEx.ChromeWebStoreInstall.install\t= function(url, successCallback, failureCallback)\n{\n\tconsole.assert( this.apiAvailable() )\n\tchrome.webstore.install(url, successCallback, failureCallback);\n}"
  },
  {
    "path": "TJunctions/vendor/threex/threex.embedded.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\nTHREEx.Embedded\t= THREEx.Embedded\t|| {};\n\n/**\n * @returns {Boolean} return true if we are in a iframe, false otherwise\n*/\nTHREEx.Embedded.inIFrame\t= function()\n{\n\treturn window != window.top ? true : false;\n}\n\n/**\n * Prevent Arrows key event from going out of the iframe\n*/\nTHREEx.Embedded.shieldArrowKeys\t= function()\n{\n\tdocument.addEventListener('keydown', function(event){\n\t\t// if it is keydown on a arrow, prevent default\n\t\tif( event.keyCode >= 37 && event.keyCode <= 40 ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, true);\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/threex.sparks.js",
    "content": "// This THREEx helper makes it even easier to use spark.js with three.js\n// * FIXME This is currently only with WebGL\n\n// \n// # Code\n\n//\n\nvar THREEx\t= THREEx \t|| {};\n\n\nTHREEx.Sparks\t= function(opts)\n{\n\topts\t\t= opts\t|| {};\n\tthis._maxParticles = opts.maxParticles\t|| console.assert(false);\n\tthis._texture\t= opts.texture\t|| this._buildDefaultTexture();\n\tvar counter\t= opts.counter\t|| console.assert(false);\n\t\n\tvar vertexIndexPool = {\n\t\t__pools: [],\n\t\t// Get a new Vector\n\t\tget: function() {\n\t\t\tif( this.__pools.length > 0 )\treturn this.__pools.pop();\n\t\t\tconsole.assert(false, \"pool ran out!\")\n\t\t\treturn null;\n\t\t},\n\t\t// Release a vector back into the pool\n\t\tadd: function(v){ this.__pools.push(v);\t}\n\t};\n\t\n\t\n\tvar particles\t= new THREE.Geometry();\n\tvar vertices\t= particles.vertices;\n\tfor ( i = 0; i < this._maxParticles; i++ ) {\n\t\tvar position\t= new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\tvertices.push(new THREE.Vertex(position));\n\t\tvertexIndexPool.add(i);\n\t}\n\n\t// to handle window resize\n\tthis._$onWindowResize\t= this._onWindowResize.bind(this);\n\twindow.addEventListener('resize', this._$onWindowResize, false);\n\n\tvar attributes\t= this._attributes\t= {\n\t\tsize\t: { type: 'f', value: [] },\n\t\taColor\t: { type: 'c', value: [] }\n\t};\n\n\tvar uniforms\t= this._uniforms\t= {\n\t\ttexture\t\t: { type: \"t\", texture: this._texture \t\t},\n\t\tcolor\t\t: { type: \"c\", value: new THREE.Color(0xffffff)\t},\n\t\tsizeRatio\t: { type: \"f\", value: this._computeSizeRatio()\t}\n\t};\n\n\t// fill attributes array\n\tvar valuesSize\t= this._attributes.size.value;\n\tvar valuesColor\t= this._attributes.aColor.value;\n\tfor(var v = 0; v < particles.vertices.length; v++ ){\n\t\tvaluesSize[v]\t= 99;\n\t\tvaluesColor[v]\t= new THREE.Color( 0x000000 );\n\t}\n\t\n\tvar material\t= new THREE.ShaderMaterial( {\n\t\tuniforms\t: this._uniforms,\n\t\tattributes\t: this._attributes,\n\t\tvertexShader\t: THREEx.Sparks.vertexShaderText,\n\t\tfragmentShader\t: THREEx.Sparks.fragmentShaderText,\n\n\t\tblending\t: THREE.AdditiveBlending,\n\t\tdepthWrite\t: false,\n\t\ttransparent\t: true\n\t});\n\n\tthis._group\t= new THREE.ParticleSystem( particles, material );\n\t//this._group.dynamic\t\t= true;\n\t//this._group.sortParticles\t= true;\t// TODO is this needed ?\t\n\n\t//// EMITTER STUFF\n\n\tvar setTargetParticle = function() {\t\t\t\t\t\n\t\tvar vertexIdx\t= vertexIndexPool.get();\n\t\tvar target\t= {\n\t\t\tvertexIdx\t: vertexIdx,\n\t\t\tsize\t\t: function(value){ valuesSize[vertexIdx] = value;\t},\n\t\t\tcolor\t\t: function(){ return valuesColor[vertexIdx];\t\t}\n\t\t};\n\t\treturn target;\n\t};\n\n\n\tvar onParticleCreated = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\t\t// copy particle position into three.js geometry\n\t\tvertices[vertexIdx].position\t= particle.position;\t\t\t\t\t\t\n\t};\n\t\n\tvar onParticleDead = function(particle) {\n\t\tvar vertexIdx\t= particle.target.vertexIdx;\n\n\t\t// Hide the particle\n\t\tvaluesColor[vertexIdx].setHex( 0x000000 );\n\t\tvertices[vertexIdx].position.set(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n\t\t\n\t\t// Mark particle system as available by returning to pool\n\t\tvertexIndexPool.add( vertexIdx );\n\t};\n\t\n\tvar emitter\t= this._emitter\t= new SPARKS.Emitter(counter);\n\n\temitter.addInitializer(new SPARKS.Target(null, setTargetParticle));\n\temitter.addCallback(\"created\"\t, onParticleCreated\t);\n\temitter.addCallback(\"dead\"\t, onParticleDead\t);\n}\n\n\nTHREEx.Sparks.prototype.destroy\t= function()\n{\n\twindow.removeEventListener('resize', this._$onWindowResize);\n\n\tif( this._emitter.isRunning() )\tthis._emitter.stop();\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\t\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype.container\t= function()\n{\n\treturn this._group;\n}\n\nTHREEx.Sparks.prototype.emitter\t\t= function()\n{\n\treturn this._emitter;\n}\n\nTHREEx.Sparks.prototype.update\t= function()\n{\n\tthis._group.geometry.__dirtyVertices\t= true;\n\tthis._group.geometry.__dirtyColors\t= true;\n\tthis._attributes.size.needsUpdate\t= true;\n\tthis._attributes.aColor.needsUpdate\t= true;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\thandle window resize\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._onWindowResize\t= function()\n{\n\tthis._uniforms.sizeRatio.value\t= this._computeSizeRatio();\n\tthis._uniforms.sizeRatio.needsUpdate\t= true;\n}\n\n\nTHREEx.Sparks.prototype._computeSizeRatio\t= function()\n{\n\treturn window.innerHeight / 1024;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tShader Text\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.vertexShaderText\t= [\n\t\"attribute\tfloat\tsize;\",\n\t\"attribute\tvec4\taColor;\",\n\t\n\t\"uniform\tfloat\tsizeRatio;\",\n\n\t\"varying\tvec4\tvColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 mvPosition= modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"gl_PointSize\t= size * sizeRatio * ( 150.0 / length( mvPosition.xyz ) );\",\n\t\t\"gl_Position\t= projectionMatrix * mvPosition;\",\n\n\t\t\"vColor\t\t= aColor;\",\n\t\"}\"\n].join('\\n');\nTHREEx.Sparks.fragmentShaderText\t= [\n\t\"uniform vec3\t\tcolor;\",\n\t\"uniform sampler2D\ttexture;\",\n\n\t\"varying vec4\t\tvColor;\",\n\t\n\t\"void main() {\",\n\t\t\"vec4 outColor\t= texture2D( texture, gl_PointCoord );\",\n\t\t\"gl_FragColor\t= outColor * vec4( color * vColor.xyz, 1.0 );\",\n\t\"}\"\n].join('\\n');\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tTexture\t\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.prototype._buildDefaultTexture\t= function(size)\n{\n\tsize\t\t= size || 128;\n\tvar canvas\t= document.createElement( 'canvas' );\n\tvar context\t= canvas.getContext( '2d' );\n\tcanvas.width\t= canvas.height\t= size;\n\t\n\tvar gradient\t= context.createRadialGradient( canvas.width/2, canvas.height /2, 0, canvas.width /2, canvas.height /2, canvas.width /2 );\t\t\t\t\n\tgradient.addColorStop( 0  , 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.2, 'rgba(255,255,255,1)' );\n\tgradient.addColorStop( 0.4, 'rgba(128,128,128,1)' );\n\tgradient.addColorStop( 1  , 'rgba(0,0,0,1)' );\n\n\tcontext.beginPath();\n\tcontext.arc(size/2, size/2, size/2, 0, Math.PI*2, false);\n\tcontext.closePath();\n\t\n\tcontext.fillStyle\t= gradient;\n\t//context.fillStyle\t= 'rgba(128,128,128,1)';\n\tcontext.fill();\n\t\t\t\n\tvar texture\t= new THREE.Texture( canvas );\n\ttexture.needsUpdate = true;\n\t\n\treturn texture;\n}\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\tCustom initializer TODO put it elsewhere\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\nTHREEx.Sparks.ColorSizeInitializer\t= function(color, size){\n\tthis._color\t= color;\n\tthis._size\t= size;\n}\nTHREEx.Sparks.ColorSizeInitializer.prototype.initialize\t= function(emitter, particle)\n{\n\tif( this._color !== undefined )\tparticle.target.color().copy(this._color);\n\tif( this._size !== undefined )\tparticle.target.size(this._size);\n}\n"
  },
  {
    "path": "TJunctions/vendor/threex/threex.texturePoolBall.js",
    "content": "// NOTE: this match THREE namespace on purpose\nif(typeof THREEx === \"undefined\")\t\tvar THREEx\t= {};\nif(typeof THREEx.Texture === \"undefined\")\tTHREEx.Texture\t= {};\n\n/**\n*/\nTHREEx.Texture.PoolBall\t= {\n\tclear\t: function(canvas){\n\t\tvar w\t= canvas.width;\n\t\tvar ctx\t= canvas.getContext( '2d' );\n\t\tclearRect(0, 0, w, w);\t\n\t},\n\t/**\n\t * display the shaddow of the smiley in a texture\n\t *\n\t * @param {canvasElement} the canvas where we draw\n\t*/\n\tdraw\t: function(canvas, textData, stripped, color){\n\t\tvar ctx\t\t= canvas.getContext( '2d' );\n\t\tvar w\t\t= canvas.width;\n\t\tvar h\t\t= canvas.height;\n\t\t\n\t\t// base color is white\n\t\tctx.save();\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tctx.fillRect(0,0, w, h);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar rectH\t= stripped ? h/2 : h;\n\t\tctx.fillStyle\t= color.getContextStyle();\n\t\tctx.fillRect(-w/2,-rectH/2, w, rectH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tctx.fillStyle\t= \"#FFFFFF\";\n\t\tvar radiusW\t= 0.7 * w/4;\n\t\tvar radiusH\t= 1.2 * h/4;\n\t\tctx.fillEllipse( -radiusW/2, -radiusH/2, radiusW, radiusH);\n\t\tctx.restore();\n\n\t\tctx.save();\n\t\tctx.translate(w/2, h/2)\n\t\tvar textH\t= w/4;\n\t\tctx.font\t= \"bolder \"+textH+\"px Arial\";\n\t\tctx.fillStyle\t= \"#000000\";\n\t\tvar textW\t= ctx.measureText(textData).width;\n\t\tctx.fillText(textData, -textW/2, 0.8*textH/2);\n\t\tctx.restore();\n\t},\n\n//////////////////////////////////////////////////////////////////////////////////\n//\t\ttexture helper\t\t\t\t\t\t\t//\n//////////////////////////////////////////////////////////////////////////////////\n\t\n\tballTexture: function( textData, stripped, color, canvasW, mapping, callback ) {\n\t\tvar canvasDrawer\t= function(canvas){\n\t\t\tTHREEx.Texture.PoolBall.draw(canvas, textData, stripped, color);\n\t\t}\n\t\treturn THREEx.Texture.PoolBall._buildTexture( canvasW, mapping, callback, canvasDrawer );\n\t},\n\t\n\t_buildTexture: function( canvasW, mapping, callback, canvasDrawer ) {\n\t\tcanvasW\t\t= typeof canvasW !== 'undefined' ? canvasW : 64;\n\t\tvar canvas\t= document.createElement('canvas');\n\t\tcanvas.width\t= canvas.height\t= canvasW;\n\t\tvar texture\t= new THREE.Texture(canvas, mapping);\n\n\t\tcanvasDrawer(canvas);\n\n\t\ttexture.needsUpdate\t= true;\n\t\tif( callback )\tcallback( this );\n\t\treturn texture;\n\t},\n\n}"
  },
  {
    "path": "TJunctions/vendor/threex.dragpancontrols.js",
    "content": "/** @namespace */\nvar THREEx\t= THREEx \t\t|| {};\n\nTHREEx.DragPanControls\t= function(object, domElement)\n{\n\tthis._object\t= object;\n\tthis._domElement= domElement || document;\n\n\t// parameters that you can change after initialisation\n\tthis.target\t= new THREE.Vector3(0, 0, 0);\n\tthis.speedX\t= 0.03;\n\tthis.speedY\t= 0.03;\n\tthis.rangeX\t= -40;\n\tthis.rangeY\t= +40;\n\n\t// private variables\n\tthis._mouseX\t= 0;\n\tthis._mouseY\t= 0;\n\n\tvar _this\t= this;\n\tthis._$onMouseMove\t= function(){ _this._onMouseMove.apply(_this, arguments); };\n\tthis._$onTouchStart\t= function(){ _this._onTouchStart.apply(_this, arguments); };\n\tthis._$onTouchMove\t= function(){ _this._onTouchMove.apply(_this, arguments); };\n\n\tthis._domElement.addEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.addEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.addEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.destroy\t= function()\n{\n\tthis._domElement.removeEventListener( 'mousemove', this._$onMouseMove, false );\n\tthis._domElement.removeEventListener( 'touchstart', this._$onTouchStart,false );\n\tthis._domElement.removeEventListener( 'touchmove', this._$onTouchMove, false );\n}\n\nTHREEx.DragPanControls.prototype.update\t= function(event)\n{\n\tthis._object.position.x += ( this._mouseX * this.rangeX - this._object.position.x ) * this.speedX;\n\tthis._object.position.y += ( this._mouseY * this.rangeY - this._object.position.y ) * this.speedY;\n\tthis._object.lookAt( this.target );\n}\n\nTHREEx.DragPanControls.prototype._onMouseMove\t= function(event)\n{\n\tthis._mouseX\t= ( event.clientX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.clientY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchStart\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\t// no preventDefault to get click event on ios\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\nTHREEx.DragPanControls.prototype._onTouchMove\t= function(event)\n{\n\tif( event.touches.length != 1 )\treturn;\n\n\tevent.preventDefault();\n\n\tthis._mouseX\t= ( event.touches[ 0 ].pageX / window.innerWidth ) - 0.5;\n\tthis._mouseY\t= ( event.touches[ 0 ].pageY / window.innerHeight) - 0.5;\n}\n\n"
  },
  {
    "path": "Terrain/MIT-LICENSE.txt",
    "content": "Copyright (c) 2011 Jerome Etienne, http://jetienne.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Terrain/Makefile",
    "content": "# makefile to automatize simple operations\n\nserver:\n\tpython -m SimpleHTTPServer\n\ndeploy:\n\t# assume there is something to commit\n\t# use \"git diff --exit-code HEAD\" to know if there is something to commit\n\t# so two lines: one if no commit, one if something to commit \n\tgit commit -a -m \"New deploy\" && git push -f origin HEAD:gh-pages && git reset HEAD~\n\n"
  },
  {
    "path": "Terrain/css/main.css",
    "content": "body {\n\toverflow\t: hidden;\n\tpadding\t\t: 0;\n\tmargin\t\t: 0;\n\n\tcolor\t\t: #222;\n\tbackground-color: #BBB;\n\tfont-family\t: arial;\n\tfont-size\t: 100%;\n}\n#info .top {\n\tposition\t: absolute;\n\ttop\t\t: 0px;\n\twidth\t\t: 100%;\n\tpadding\t\t: 5px;\n\ttext-align\t: center;\n}\n#info a {\n\tcolor\t\t: #66F;\n\ttext-decoration\t: none;\n}\n#info a:hover {\n\ttext-decoration\t: underline;\n}\n#info .bottom {\n\tposition\t: absolute;\n\tbottom\t\t: 0px;\n\tright\t\t: 5px;\n\tpadding\t\t: 5px;\n}\n\n#info .controls {\n\tposition\t: absolute;\n\ttop\t\t: 10px;\n\tleft\t\t: 10px;\n\tpadding\t\t: 5px;\n}\n"
  },
  {
    "path": "Terrain/index.html",
    "content": "<html>\n<head>\n  <meta charset = \"utf-8\">\n  <title> WebGL Boilerplate </title>\n  <script src=\"/require.js\"></script>\n</head>\n<body>\n\n<canvas></canvas>\n<div id = \"info\" >< /div >\n\n<script id = \"vs\" type = \"x-shader/vertex\" > \nattribute vec3 position;\nvoid main () {\n  gl_Position = vec4 (position, 1.0);\n}\n</script>\n\n<script id = \"fs\" type = \"x-shader/fragment\" > \nuniform float time;\nuniform vec2 resolution;\nvoid main (void) {\n  vec2 position = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;\n  float red = abs (sin (position.x * position.y + time / 5.0));\n  float green = abs (sin (position.x * position.y + time / 4.0));\n  float blue = abs (sin (position.x * position.y + time / 3.0));\n  gl_FragColor = vec4 (red, green, blue, 1.0);\n}\n</script > \n\n<script >\n\n(function() {\n\"use strict\";\n\nvar webgl = require('./js/webgl.js');\nwebgl.once('init', function() {\n\n  \n\n\n});\n\n\n})();\n\n</script >\n</body >\n</html >\n"
  },
  {
    "path": "Terrain/index.html~",
    "content": "<!DOCTYPE HTML> \n<html> \n\t<head> \n\t\t<meta charset=\"utf-8\"> \n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n\t\t<title>WebGL Boilerplate</title> \n\n\t\t<style> \n\t\t\tbody {\n\t\t\t\tbackground-color: #000000;\n\t\t\t\tmargin: 0px;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t</style> \n\t</head> \n\t<body> \n \n\t\t<canvas></canvas>\n\t\t<div id=\"info\"></div> \n \n\t\t<script id=\"vs\" type=\"x-shader/vertex\"> \n \n\t\t\tattribute vec3 position;\n \n\t\t\tvoid main() {\n \n\t\t\t\tgl_Position = vec4( position, 1.0 );\n \n\t\t\t}\n \n\t\t</script> \n \n\t\t<script id=\"fs\" type=\"x-shader/fragment\"> \n \n\t\t\tuniform float time;\n\t\t\tuniform vec2 resolution;\n \n\t\t\tvoid main( void ) {\n \n\t\t\t\tvec2 position = - 1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;\n\t\t\t\tfloat red = abs( sin( position.x * position.y + time / 5.0 ) );\n\t\t\t\tfloat green = abs( sin( position.x * position.y + time / 4.0 ) );\n\t\t\t\tfloat blue = abs( sin( position.x * position.y + time / 3.0 ) );\n\t\t\t\tgl_FragColor = vec4( red, green, blue, 1.0 );\n \n\t\t\t}\n \n\t\t</script> \n \n\t\t<script> \n \n\t\t\t/**\n\t\t\t * Provides requestAnimationFrame in a cross browser way.\n\t\t\t * paulirish.com/2011/requestanimationframe-for-smart-animating/\n\t\t\t */\n\t\t\twindow.requestAnimationFrame = window.requestAnimationFrame || ( function() {\n\n\t\t\t\treturn  window.webkitRequestAnimationFrame ||\n\t\t\t\t        window.mozRequestAnimationFrame ||\n\t\t\t\t        window.oRequestAnimationFrame ||\n\t\t\t\t        window.msRequestAnimationFrame ||\n\t\t\t\t        function(  callback, element ) {\n\t\t\t\t\t        window.setTimeout( callback, 1000 / 60 );\n\t\t\t\t        };\n\n\t\t\t})();\n\n \n\t\t\tvar canvas, \n\t\t\t    gl, \n\t\t\t    buffer, \n\t\t\t    vertex_shader, fragment_shader, \n\t\t\t    currentProgram,\n\t\t\t    vertex_position, \n\t\t\t    parameters = {  start_time  : new Date().getTime(), \n\t\t\t                    time        : 0, \n\t\t\t                    screenWidth : 0, \n\t\t\t                    screenHeight: 0 };\n \n\t\t\tinit();\n\t\t\tanimate();\n \n\t\t\tfunction init() {\n \n\t\t\t\tvertex_shader = document.getElementById('vs').textContent;\n\t\t\t\tfragment_shader = document.getElementById('fs').textContent;\n \n\n \n\t\t\t\tcanvas = document.querySelector( 'canvas' );\n\n \n\t\t\t\t// Initialise WebGL\n \n\t\t\t\ttry {\n \n\t\t\t\t\tgl = canvas.getContext( 'experimental-webgl' );\n \n\t\t\t\t} catch( error ) { }\n \n\t\t\t\tif ( !gl ) {\n \n\t\t\t\t\tthrow \"cannot create webgl context\";\n \n\t\t\t\t}\n \n\t\t\t\t// Create Vertex buffer (2 triangles)\n \n\t\t\t\tbuffer = gl.createBuffer();\n\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\t\t\t\tgl.bufferData( gl.ARRAY_BUFFER, new Float32Array( [ - 1.0, - 1.0, 1.0, - 1.0, - 1.0, 1.0, 1.0, - 1.0, 1.0, 1.0, - 1.0, 1.0 ] ), gl.STATIC_DRAW );\n \n\t\t\t\t// Create Program\n \n\t\t\t\tcurrentProgram = createProgram( vertex_shader, fragment_shader );\n \n\t\t\t\tonWindowResize();\n\t\t\t\twindow.addEventListener( 'resize', onWindowResize, false );\n \n\t\t\t}\n \n\t\t\tfunction createProgram( vertex, fragment ) {\n \n\t\t\t\tvar program = gl.createProgram();\n \n\t\t\t\tvar vs = createShader( vertex, gl.VERTEX_SHADER );\n\t\t\t\tvar fs = createShader( '#ifdef GL_ES\\nprecision highp float;\\n#endif\\n\\n' + fragment, gl.FRAGMENT_SHADER );\n \n\t\t\t\tif ( vs == null || fs == null ) return null;\n \n\t\t\t\tgl.attachShader( program, vs );\n\t\t\t\tgl.attachShader( program, fs );\n \n\t\t\t\tgl.deleteShader( vs );\n\t\t\t\tgl.deleteShader( fs );\n \n\t\t\t\tgl.linkProgram( program );\n \n\t\t\t\tif ( !gl.getProgramParameter( program, gl.LINK_STATUS ) ) {\n \n\t\t\t\t\talert( \"ERROR:\\n\" +\n\t\t\t\t\t\"VALIDATE_STATUS: \" + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + \"\\n\" +\n\t\t\t\t\t\"ERROR: \" + gl.getError() + \"\\n\\n\" +\n\t\t\t\t\t\"- Vertex Shader -\\n\" + vertex + \"\\n\\n\" +\n\t\t\t\t\t\"- Fragment Shader -\\n\" + fragment );\n \n\t\t\t\t\treturn null;\n \n\t\t\t\t}\n \n\t\t\t\treturn program;\n \n\t\t\t}\n \n\t\t\tfunction createShader( src, type ) {\n \n\t\t\t\tvar shader = gl.createShader( type );\n \n\t\t\t\tgl.shaderSource( shader, src );\n\t\t\t\tgl.compileShader( shader );\n \n\t\t\t\tif ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) {\n \n\t\t\t\t\talert( ( type == gl.VERTEX_SHADER ? \"VERTEX\" : \"FRAGMENT\" ) + \" SHADER:\\n\" + gl.getShaderInfoLog( shader ) );\n\t\t\t\t\treturn null;\n \n\t\t\t\t}\n \n\t\t\t\treturn shader;\n \n\t\t\t}\n \n\t\t\tfunction onWindowResize( event ) {\n \n\t\t\t\tcanvas.width = window.innerWidth;\n\t\t\t\tcanvas.height = window.innerHeight;\n \n\t\t\t\tparameters.screenWidth = canvas.width;\n\t\t\t\tparameters.screenHeight = canvas.height;\n \n\t\t\t\tgl.viewport( 0, 0, canvas.width, canvas.height );\n \n\t\t\t}\n \n\t\t\tfunction animate() {\n \n\t\t\t\trequestAnimationFrame( animate );\n\t\t\t\trender();\n \n\t\t\t}\n \n\t\t\tfunction render() {\n \n\t\t\t\tif ( !currentProgram ) return;\n \n\t\t\t\tparameters.time = new Date().getTime() - parameters.start_time;\n \n\t\t\t\tgl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );\n \n\t\t\t\t// Load program into GPU\n \n\t\t\t\tgl.useProgram( currentProgram );\n \n\t\t\t\t// Set values to program variables\n \n\t\t\t\tgl.uniform1f( gl.getUniformLocation( currentProgram, 'time' ), parameters.time / 1000 );\n\t\t\t\tgl.uniform2f( gl.getUniformLocation( currentProgram, 'resolution' ), parameters.screenWidth, parameters.screenHeight );\n \n\t\t\t\t// Render geometry\n \n\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\t\t\t\tgl.vertexAttribPointer( vertex_position, 2, gl.FLOAT, false, 0, 0 );\n\t\t\t\tgl.enableVertexAttribArray( vertex_position );\n\t\t\t\tgl.drawArrays( gl.TRIANGLES, 0, 6 );\n\t\t\t\tgl.disableVertexAttribArray( vertex_position );\n \n\t\t\t}\n \n\t\t</script> \n \n\t</body> \n</html>\n"
  },
  {
    "path": "Terrain/js/dualcontour.js",
    "content": "/**\n * Dual contouring in javascript\n *\n * Written by Mikola Lysenko (C) 2012\n *\n * Free to use, but give credit.\n */\nvar DualContouring = (function() {\n\n//Precompute edge tables.\n// This saves a bit of time when computing the centroid of each boundary cell\nvar cube_edges = new Int32Array([\n      0, 1  //First 3 edges are used for generating faces\n    , 0, 2\n    , 0, 4\n    , 1, 3  //Order for these edges does not matter\n    , 1, 5\n    , 2, 3\n    , 2, 6\n    , 3, 7\n    , 4, 5\n    , 4, 6\n    , 5, 7\n    , 6, 7 ])\n  , edge_table = new Int32Array(256);\n(function() {\n  for(var i=0; i<256; ++i) {\n    var em = 0;\n    for(var j=0; j<24; j+=2) {\n      var a = !!(i & (1<<cube_edges[j]))\n        , b = !!(i & (1<<cube_edges[j+1]));\n      em |= a !== b ? (1 << (j >> 1)) : 0;\n    }\n    edge_table[i] = em;\n  }\n})();\n\n//Internal buffer\nvar buffer = new Int32Array(0);\n\nreturn {\n\nmeshTransition: function(data0, dims0, bnd0, data1, dims1, bnd1) {\n  return { vertices:[], faces:[] };\n},\n\nmeshVolume: function(data, dims) {\n  var vertices = []\n    , faces = []\n    , n = 0\n    , x = new Int32Array(3)\n    , R = new Int32Array([1, (dims[0]+1), (dims[0]+1)*(dims[0]+1)])\n    , grid = new Float32Array(8)\n    , buf_no = 1;\n   \n  //Resize buffer if necessary \n  if(R[2] * 2 > buffer.length) {\n    buffer = new Int32Array(R[2] * 2);\n  }\n  \n  //March over the voxel grid\n  for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) {\n    var m = 1 + (dims[0]+1) * (1 + buf_no * (dims[1]+1));\n    for(x[1]=0; x[1]<dims[1]-1; ++x[1], ++n, m+=2)\n    for(x[0]=0; x[0]<dims[0]-1; ++x[0], ++n, ++m) {\n    \n      //Read in field values\n      var mask = 0, g = 0, idx = n;\n      for(var k=0; k<2; ++k, idx += dims[0]*(dims[1]-2))\n      for(var j=0; j<2; ++j, idx += dims[0]-2)      \n      for(var i=0; i<2; ++i, ++g, ++idx) {\n        var p = data[idx];\n        grid[g] = p;\n        mask |= (p < 0) ? (1<<g) : 0;\n      }\n      \n      //Check edge mask\n      var edge_mask = edge_table[mask];\n      if(!edge_mask) {\n        continue;\n      }\n      \n      //Sum up edge intersections\n      var v = [0.0,0.0,0.0], e_count = 0;\n      for(var i=0; i<12; ++i) {\n        if(!(edge_mask & (1<<i))) {\n          continue;\n        }\n        ++e_count;\n        var e0 = cube_edges[ i<<1 ]\n          , e1 = cube_edges[(i<<1)+1]\n          , g0 = grid[e0]\n          , g1 = grid[e1]\n          , t  = g0 - g1;\n        if(Math.abs(t) > 1e-6) {\n          t = g0 / t;\n        } else {\n          continue;\n        }\n        for(var j=0, k=1; j<3; ++j, k<<=1) {\n          var a = e0 & k;\n          if(a & (~e1)) {\n            v[j] += !!a ? 1.0 - t : t;\n          } else {\n            v[j] += !!a ? 1.0 : 0;\n          }\n        }\n      }\n      \n      //Average edge intersections to get vertex\n      var s = 1.0 / e_count;\n      for(var i=0; i<3; ++i) {\n        v[i] = x[i] + s * v[i];\n      }\n      buffer[m] = vertices.length;\n      vertices.push(v);\n      \n      //Connect faces together\n      for(var i=0; i<3; ++i) {\n        if(!(edge_mask & (1<<i)) ) {\n          continue;\n        }\n        var iu = (i+1)%3\n          , iv = (i+2)%3\n        if(x[iu] === 0 || x[iv] === 0) {\n          continue;\n        }\n        var du = R[iu]\n          , dv = R[iv];\n        if(mask & 1) {\n          faces.push([buffer[m], buffer[m-du], buffer[m-du-dv], buffer[m-dv]]);\n        } else {\n          faces.push([buffer[m], buffer[m-dv], buffer[m-du-dv], buffer[m-du]]);\n        }\n      }\n    }\n  }\n  return { vertices: vertices, faces: faces };\n}\n\n};\n})();\n\n\nif(exports) {\n  exports.meshVolume = DualContouring;\n}\n\n"
  },
  {
    "path": "Terrain/js/events.js",
    "content": ";!function(exports, undefined) {\n\n  var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {\n    return Object.prototype.toString.call(obj) === \"[object Array]\";\n  };\n  var defaultMaxListeners = 10;\n\n  function init() {\n    this._events = new Object;\n  }\n\n  function configure(conf) {\n    if (conf) {\n      conf.delimiter && (this.delimiter = conf.delimiter);\n      conf.wildcard && (this.wildcard = conf.wildcard);\n      if (this.wildcard) {\n        this.listenerTree = new Object;\n      }\n    }\n  }\n\n  function EventEmitter(conf) {\n    this._events = new Object;\n    configure.call(this, conf);\n  }\n\n  //\n  // Attention, function return type now is array, always !\n  // It has zero elements if no any matches found and one or more\n  // elements (leafs) if there are matches\n  //\n  function searchListenerTree(handlers, type, tree, i) {\n    if (!tree) {\n      return [];\n    }\n    var listeners=[], leaf, len, branch, xTree, xxTree, isolatedBranch, endReached,\n        typeLength = type.length, currentType = type[i], nextType = type[i+1];\n    if (i === typeLength && tree._listeners) {\n      //\n      // If at the end of the event(s) list and the tree has listeners\n      // invoke those listeners.\n      //\n      if (typeof tree._listeners === 'function') {\n        handlers && handlers.push(tree._listeners);\n        return [tree];\n      } else {\n        for (leaf = 0, len = tree._listeners.length; leaf < len; leaf++) {\n          handlers && handlers.push(tree._listeners[leaf]);\n        }\n        return [tree];\n      }\n    }\n\n    if ((currentType === '*' || currentType === '**') || tree[currentType]) {\n      //\n      // If the event emitted is '*' at this part\n      // or there is a concrete match at this patch\n      //\n      if (currentType === '*') {\n        for (branch in tree) {\n          if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\n            listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+1));\n          }\n        }\n        return listeners;\n      } else if(currentType === '**') {\n        endReached = (i+1 === typeLength || (i+2 === typeLength && nextType === '*'));\n        if(endReached && tree._listeners) {\n          // The next element has a _listeners, add it to the handlers.\n          listeners = listeners.concat(searchListenerTree(handlers, type, tree, typeLength));\n        }\n\n        for (branch in tree) {\n          if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\n            if(branch === '*' || branch === '**') {\n              if(tree[branch]._listeners && !endReached) {\n                listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], typeLength));\n              }\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\n            } else if(branch === nextType) {\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+2));\n            } else {\n              // No match on this one, shift into the tree but not in the type array.\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\n            }\n          }\n        }\n        return listeners;\n      }\n\n      listeners = listeners.concat(searchListenerTree(handlers, type, tree[currentType], i+1));\n    }\n\n    xTree = tree['*'];\n    if (xTree) {\n      //\n      // If the listener tree will allow any match for this part,\n      // then recursively explore all branches of the tree\n      //\n      searchListenerTree(handlers, type, xTree, i+1);\n    }\n    \n    xxTree = tree['**'];\n    if(xxTree) {\n      if(i < typeLength) {\n        if(xxTree._listeners) {\n          // If we have a listener on a '**', it will catch all, so add its handler.\n          searchListenerTree(handlers, type, xxTree, typeLength);\n        }\n        \n        // Build arrays of matching next branches and others.\n        for(branch in xxTree) {\n          if(branch !== '_listeners' && xxTree.hasOwnProperty(branch)) {\n            if(branch === nextType) {\n              // We know the next element will match, so jump twice.\n              searchListenerTree(handlers, type, xxTree[branch], i+2);\n            } else if(branch === currentType) {\n              // Current node matches, move into the tree.\n              searchListenerTree(handlers, type, xxTree[branch], i+1);\n            } else {\n              isolatedBranch = {};\n              isolatedBranch[branch] = xxTree[branch];\n              searchListenerTree(handlers, type, { '**': isolatedBranch }, i+1);\n            }\n          }\n        }\n      } else if(xxTree._listeners) {\n        // We have reached the end and still on a '**'\n        searchListenerTree(handlers, type, xxTree, typeLength);\n      } else if(xxTree['*'] && xxTree['*']._listeners) {\n        searchListenerTree(handlers, type, xxTree['*'], typeLength);\n      }\n    }\n\n    return listeners;\n  }\n\n  function growListenerTree(type, listener) {\n\n    type = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n    \n    //\n    // Looks for two consecutive '**', if so, don't add the event at all.\n    //\n    for(var i = 0, len = type.length; i+1 < len; i++) {\n      if(type[i] === '**' && type[i+1] === '**') {\n        return;\n      }\n    }\n\n    var tree = this.listenerTree;\n    var name = type.shift();\n\n    while (name) {\n\n      if (!tree[name]) {\n        tree[name] = new Object;\n      }\n\n      tree = tree[name];\n\n      if (type.length === 0) {\n\n        if (!tree._listeners) {\n          tree._listeners = listener;\n        }\n        else if(typeof tree._listeners === 'function') {\n          tree._listeners = [tree._listeners, listener];\n        }\n        else if (isArray(tree._listeners)) {\n\n          tree._listeners.push(listener);\n\n          if (!tree._listeners.warned) {\n\n            var m = defaultMaxListeners;\n            \n            if (typeof this._events.maxListeners !== 'undefined') {\n              m = this._events.maxListeners;\n            }\n\n            if (m > 0 && tree._listeners.length > m) {\n\n              tree._listeners.warned = true;\n              console.error('(node) warning: possible EventEmitter memory ' +\n                            'leak detected. %d listeners added. ' +\n                            'Use emitter.setMaxListeners() to increase limit.',\n                            tree._listeners.length);\n              console.trace();\n            }\n          }\n        }\n        return true;\n      }\n      name = type.shift();\n    }\n    return true;\n  };\n\n  // By default EventEmitters will print a warning if more than\n  // 10 listeners are added to it. This is a useful default which\n  // helps finding memory leaks.\n  //\n  // Obviously not all Emitters should be limited to 10. This function allows\n  // that to be increased. Set to zero for unlimited.\n\n  EventEmitter.prototype.delimiter = '.';\n\n  EventEmitter.prototype.setMaxListeners = function(n) {\n    this._events || init.call(this);\n    this._events.maxListeners = n;\n  };\n\n  EventEmitter.prototype.event = '';\n\n  EventEmitter.prototype.once = function(event, fn) {\n    this.many(event, 1, fn);\n    return this;\n  };\n\n  EventEmitter.prototype.many = function(event, ttl, fn) {\n    var self = this;\n\n    if (typeof fn !== 'function') {\n      throw new Error('many only accepts instances of Function');\n    }\n\n    function listener() {\n      if (--ttl === 0) {\n        self.off(event, listener);\n      }\n      fn.apply(this, arguments);\n    };\n\n    listener._origin = fn;\n\n    this.on(event, listener);\n\n    return self;\n  };\n\n  EventEmitter.prototype.emit = function() {\n    this._events || init.call(this);\n\n    var type = arguments[0];\n\n    if (type === 'newListener') {\n      if (!this._events.newListener) { return false; }\n    }\n\n    // Loop through the *_all* functions and invoke them.\n    if (this._all) {\n      var l = arguments.length;\n      var args = new Array(l - 1);\n      for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n      for (i = 0, l = this._all.length; i < l; i++) {\n        this.event = type;\n        this._all[i].apply(this, args);\n      }\n    }\n\n    // If there is no 'error' event listener then throw.\n    if (type === 'error') {\n      \n      if (!this._all && \n        !this._events.error && \n        !(this.wildcard && this.listenerTree.error)) {\n\n        if (arguments[1] instanceof Error) {\n          throw arguments[1]; // Unhandled 'error' event\n        } else {\n          throw new Error(\"Uncaught, unspecified 'error' event.\");\n        }\n        return false;\n      }\n    }\n\n    var handler;\n\n    if(this.wildcard) {\n      handler = [];\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n      searchListenerTree.call(this, handler, ns, this.listenerTree, 0);\n    }\n    else {\n      handler = this._events[type];\n    }\n\n    if (typeof handler === 'function') {\n      this.event = type;\n      if (arguments.length === 1) {\n        handler.call(this);\n      }\n      else if (arguments.length > 1)\n        switch (arguments.length) {\n          case 2:\n            handler.call(this, arguments[1]);\n            break;\n          case 3:\n            handler.call(this, arguments[1], arguments[2]);\n            break;\n          // slower\n          default:\n            var l = arguments.length;\n            var args = new Array(l - 1);\n            for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n            handler.apply(this, args);\n        }\n      return true;\n    }\n    else if (handler) {\n      var l = arguments.length;\n      var args = new Array(l - 1);\n      for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n\n      var listeners = handler.slice();\n      for (var i = 0, l = listeners.length; i < l; i++) {\n        this.event = type;\n        listeners[i].apply(this, args);\n      }\n      return (listeners.length > 0) || this._all;\n    }\n    else {\n      return this._all;\n    }\n\n  };\n\n  EventEmitter.prototype.on = function(type, listener) {\n    \n    if (typeof type === 'function') {\n      this.onAny(type);\n      return this;\n    }\n\n    if (typeof listener !== 'function') {\n      throw new Error('on only accepts instances of Function');\n    }\n    this._events || init.call(this);\n\n    // To avoid recursion in the case that type == \"newListeners\"! Before\n    // adding it to the listeners, first emit \"newListeners\".\n    this.emit('newListener', type, listener);\n\n    if(this.wildcard) {\n      growListenerTree.call(this, type, listener);\n      return this;\n    }\n\n    if (!this._events[type]) {\n      // Optimize the case of one listener. Don't need the extra array object.\n      this._events[type] = listener;\n    }\n    else if(typeof this._events[type] === 'function') {\n      // Adding the second element, need to change to array.\n      this._events[type] = [this._events[type], listener];\n    }\n    else if (isArray(this._events[type])) {\n      // If we've already got an array, just append.\n      this._events[type].push(listener);\n\n      // Check for listener leak\n      if (!this._events[type].warned) {\n\n        var m = defaultMaxListeners;\n        \n        if (typeof this._events.maxListeners !== 'undefined') {\n          m = this._events.maxListeners;\n        }\n\n        if (m > 0 && this._events[type].length > m) {\n\n          this._events[type].warned = true;\n          console.error('(node) warning: possible EventEmitter memory ' +\n                        'leak detected. %d listeners added. ' +\n                        'Use emitter.setMaxListeners() to increase limit.',\n                        this._events[type].length);\n          console.trace();\n        }\n      }\n    }\n    return this;\n  };\n\n  EventEmitter.prototype.onAny = function(fn) {\n\n    if(!this._all) {\n      this._all = [];\n    }\n\n    if (typeof fn !== 'function') {\n      throw new Error('onAny only accepts instances of Function');\n    }\n\n    // Add the function to the event listener collection.\n    this._all.push(fn);\n    return this;\n  };\n\n  EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n  EventEmitter.prototype.off = function(type, listener) {\n    if (typeof listener !== 'function') {\n      throw new Error('removeListener only takes instances of Function');\n    }\n\n    var handlers,leafs=[];\n\n    if(this.wildcard) {\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n      leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\n    }\n    else {\n      // does not use listeners(), so no side effect of creating _events[type]\n      if (!this._events[type]) return this;\n      handlers = this._events[type];\n      leafs.push({_listeners:handlers});\n    }\n\n    for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\n      var leaf = leafs[iLeaf];\n      handlers = leaf._listeners;\n      if (isArray(handlers)) {\n\n        var position = -1;\n\n        for (var i = 0, length = handlers.length; i < length; i++) {\n          if (handlers[i] === listener ||\n            (handlers[i].listener && handlers[i].listener === listener) ||\n            (handlers[i]._origin && handlers[i]._origin === listener)) {\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0) {\n          return this;\n        }\n\n        if(this.wildcard) {\n          leaf._listeners.splice(position, 1)\n        }\n        else {\n          this._events[type].splice(position, 1);\n        }\n\n        if (handlers.length === 0) {\n          if(this.wildcard) {\n            delete leaf._listeners;\n          }\n          else {\n            delete this._events[type];\n          }\n        }\n      }\n      else if (handlers === listener ||\n        (handlers.listener && handlers.listener === listener) ||\n        (handlers._origin && handlers._origin === listener)) {\n        if(this.wildcard) {\n          delete leaf._listeners;\n        }\n        else {\n          delete this._events[type];\n        }\n      }\n    }\n\n    return this;\n  };\n\n  EventEmitter.prototype.offAny = function(fn) {\n    var i = 0, l = 0, fns;\n    if (fn && this._all && this._all.length > 0) {\n      fns = this._all;\n      for(i = 0, l = fns.length; i < l; i++) {\n        if(fn === fns[i]) {\n          fns.splice(i, 1);\n          return this;\n        }\n      }\n    } else {\n      this._all = [];\n    }\n    return this;\n  };\n\n  EventEmitter.prototype.removeListener = EventEmitter.prototype.off;\n\n  EventEmitter.prototype.removeAllListeners = function(type) {\n    if (arguments.length === 0) {\n      !this._events || init.call(this);\n      return this;\n    }\n\n    if(this.wildcard) {\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n      var leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\n\n      for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\n        var leaf = leafs[iLeaf];\n        leaf._listeners = null;\n      }\n    }\n    else {\n      if (!this._events[type]) return this;\n      this._events[type] = null;\n    }\n    return this;\n  };\n\n  EventEmitter.prototype.listeners = function(type) {\n    if(this.wildcard) {\n      var handlers = [];\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n      searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);\n      return handlers;\n    }\n\n    this._events || init.call(this);\n\n    if (!this._events[type]) this._events[type] = [];\n    if (!isArray(this._events[type])) {\n      this._events[type] = [this._events[type]];\n    }\n    return this._events[type];\n  };\n\n  EventEmitter.prototype.listenersAny = function() {\n\n    if(this._all) {\n      return this._all;\n    }\n    else {\n      return [];\n    }\n\n  };\n\n  if (typeof define === 'function' && define.amd) {\n    define(function() {\n      return EventEmitter;\n    });\n  } else {\n    exports.EventEmitter = EventEmitter; \n  }\n\n}(typeof exports !== 'undefined' ? exports : window);\n"
  },
  {
    "path": "Terrain/js/perlinnoise.js",
    "content": "\n//This code is from Kas Thomas' blog:\n//  http://asserttrue.blogspot.de/2011/12/perlin-noise-in-javascript_31.html\n\n// This is a port of Ken Perlin's Java code. The\n// original Java code is at http://cs.nyu.edu/%7Eperlin/noise/.\n// Note that in this version, a number from 0 to 1 is returned.\nPerlinNoise = new function() {\n\nthis.noise = function(x, y, z) {\n\n   var p = new Array(512)\n   var permutation = [ 151,160,137,91,90,15,\n   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n   ];\n   for (var i=0; i < 256 ; i++) \n p[256+i] = p[i] = permutation[i]; \n\n      var X = Math.floor(x) & 255,                  // FIND UNIT CUBE THAT\n          Y = Math.floor(y) & 255,                  // CONTAINS POINT.\n          Z = Math.floor(z) & 255;\n      x -= Math.floor(x);                                // FIND RELATIVE X,Y,Z\n      y -= Math.floor(y);                                // OF POINT IN CUBE.\n      z -= Math.floor(z);\n      var    u = fade(x),                                // COMPUTE FADE CURVES\n             v = fade(y),                                // FOR EACH OF X,Y,Z.\n             w = fade(z);\n      var A = p[X  ]+Y, AA = p[A]+Z, AB = p[A+1]+Z,      // HASH COORDINATES OF\n          B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;      // THE 8 CUBE CORNERS,\n\n      return scale(lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ),  // AND ADD\n                                     grad(p[BA  ], x-1, y  , z   )), // BLENDED\n                             lerp(u, grad(p[AB  ], x  , y-1, z   ),  // RESULTS\n                                     grad(p[BB  ], x-1, y-1, z   ))),// FROM  8\n                     lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  // CORNERS\n                                     grad(p[BA+1], x-1, y  , z-1 )), // OF CUBE\n                             lerp(u, grad(p[AB+1], x  , y-1, z-1 ),\n                                     grad(p[BB+1], x-1, y-1, z-1 )))));\n   }\n   function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n   function lerp( t, a, b) { return a + t * (b - a); }\n   function grad(hash, x, y, z) {\n      var h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE\n      var u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.\n             v = h<4 ? y : h==12||h==14 ? x : z;\n      return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);\n   } \n   function scale(n) { return (1 + n)/2; }\n}\n"
  },
  {
    "path": "Terrain/js/testdata.js",
    "content": "function createTestData() {\n  var result = {};\n  \n  function memoize(f) {\n    var cached = null;\n    return function() {\n      if(cached === null) { \n        cached = f();\n      }\n      return cached;\n    }\n  }\n  \n  function makeVolume(dims, f) {\n    return memoize(function() {\n      var res = new Array(3);\n      for(var i=0; i<3; ++i) {\n        res[i] = 2 + Math.ceil((dims[i][1] - dims[i][0]) / dims[i][2]);\n      }\n      var volume = new Float32Array(res[0] * res[1] * res[2])\n        , n = 0;\n      for(var k=0, z=dims[2][0]-dims[2][2]; k<res[2]; ++k, z+=dims[2][2])\n      for(var j=0, y=dims[1][0]-dims[1][2]; j<res[1]; ++j, y+=dims[1][2])\n      for(var i=0, x=dims[0][0]-dims[0][2]; i<res[0]; ++i, x+=dims[0][2], ++n) {\n        volume[n] = f(x,y,z);\n      }\n      return {data: volume, dims:res};\n    });\n  }\n\n  result['Sphere'] = makeVolume(\n    [[-1.0, 1.0, 0.25],\n     [-1.0, 1.0, 0.25],\n     [-1.0, 1.0, 0.25]],\n    function(x,y,z) {\n      return x*x + y*y + z*z - 1.0;\n    }\n  );\n  \n  result['Torus'] = makeVolume(\n    [[-2.0, 2.0, 0.2],\n     [-2.0, 2.0, 0.2],\n     [-1.0, 1.0, 0.2]],\n    function(x,y,z) {\n      return Math.pow(1.0 - Math.sqrt(x*x + y*y), 2) + z*z - 0.25;\n    }\n  );\n\n  result['Big Sphere'] = makeVolume(\n    [[-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05]],\n    function(x,y,z) {\n      return x*x + y*y + z*z - 1.0;\n    }\n  );\n  \n  result['Hyperelliptic'] = makeVolume(\n    [[-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05],\n     [-1.0, 1.0, 0.05]],\n    function(x,y,z) {\n      return Math.pow( Math.pow(x, 6) + Math.pow(y, 6) + Math.pow(z, 6), 1.0/6.0 ) - 1.0;\n    }  \n  );\n  \n  result['Nodal Cubic'] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      return x*y + y*z + z*x + x*y*z;\n    }\n  );\n  \n  result[\"Goursat's Surface\"] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      return Math.pow(x,4) + Math.pow(y,4) + Math.pow(z,4) - 1.5 * (x*x  + y*y + z*z) + 1;\n    }\n  );\n  \n  result[\"Heart\"] = makeVolume(\n    [[-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05],\n     [-2.0, 2.0, 0.05]],\n    function(x,y,z) {\n      y *= 1.5;\n      z *= 1.5;\n      return Math.pow(2*x*x+y*y+2*z*z-1, 3) - 0.1 * z*z*y*y*y - y*y*y*x*x;\n    }\n  );\n  \n  result[\"Nordstrand's Weird Surface\"] = makeVolume(\n    [[-0.8, 0.8, 0.01],\n     [-0.8, 0.8, 0.01],\n     [-0.8, 0.8, 0.01]],\n    function(x,y,z) {\n      return 25 * (Math.pow(x,3)*(y+z) + Math.pow(y,3)*(x+z) + Math.pow(z,3)*(x+y)) +\n        50 * (x*x*y*y + x*x*z*z + y*y*z*z) -\n        125 * (x*x*y*z + y*y*x*z+z*z*x*y) +\n        60*x*y*z -\n        4*(x*y+x*z+y*z);\n    }\n  );\n  \n  result['Sine Waves'] = makeVolume(\n    [[-Math.PI*2, Math.PI*2, Math.PI/8],\n     [-Math.PI*2, Math.PI*2, Math.PI/8],\n     [-Math.PI*2, Math.PI*2, Math.PI/8]],\n    function(x,y,z) {\n      return Math.sin(x) + Math.sin(y) + Math.sin(z);\n    }\n  );\n  \n  result['Perlin Noise'] = makeVolume(\n    [[-5, 5, 0.25],\n     [-5, 5, 0.25],\n     [-5, 5, 0.25]],\n    function(x,y,z) {\n      return PerlinNoise.noise(x,y,z) - 0.5;\n    }\n  );\n    \n  result['Asteroid'] = makeVolume(\n    [[-1, 1, 0.08],\n     [-1, 1, 0.08],\n     [-1, 1, 0.08]],\n    function(x,y,z) {\n      return (x*x + y*y + z*z) - PerlinNoise.noise(x*2,y*2,z*2);\n    }\n  );\n  \n  result['Terrain'] = makeVolume(\n    [[-1, 1, 0.05],\n     [-1, 1, 0.05],\n     [-1, 1, 0.05]],\n    function(x,y,z) {\n      return  y + PerlinNoise.noise(x*2+5,y*2+3,z*2+0.6);\n    }\n  );\n  \n  result['Empty'] = function(){ return { data: new Float32Array(32*32*32), dims:[32,32,32] } };\n  \n  return result;\n}\n"
  },
  {
    "path": "Terrain/js/webgl.js",
    "content": "\"use strict\";\n\n//Retrieve event emitter\nvar EventEmitter = require('./events.js').EventEmitter;\nmodule.exports = new EventEmitter();\n\nexports.gl = null;\n\n//State tracking stuff, reduce number of render state changes\nvar current_array_buffer    = null\n  , current_element_buffer  = null\n  , current_shader = null\n  , current_attributes = [];\n\n\n//------------------------------------------------------------------\n// Vertex Buffer Objects\n//------------------------------------------------------------------\n//Vertex buffer wrapper\nfunction VertexBuffer(args) {\n  this.buffer = exports.gl.createBuffer();\n  this.type   = args.type || exports.gl.ARRAY_BUFFER;\n  this.size   = 0;\n  this.deleted = false;\n  //Initialize data\n  this.bind();\n  if(args.data) {\n    this.size = args.data.length;\n    exports.gl.bufferData(this.type, args.data, args.hint || exports.gl.STATIC_DRAW);\n  } else if(args.size) {\n    this.size = args.size;\n    exports.gl.bufferData(this.type, args.size, args.hint || exports.gl.STATIC_DRAW);\n  }\n  exports.emit(\"vbo\", this);\n};\nVertexBuffer.prototype = {\n  bind: function() {\n    if(this.deleted) {\n      return;\n    }\n    if(this.type === exports.gl.ARRAY_BUFFER) {\n      if(current_array_buffer === this)\n        return;\n      exports.gl.bindBuffer(this.type, this.buffer);\n      current_array_buffer = this;\n    } else {\n      if(current_element_buffer === this)\n        return;\n      exports.gl.bindBuffer(this.type, this.buffer);\n      current_element_buffer = this;\n    }\n  }\n  , set: function(data, hint) {\n    if(this.deleted) {\n      return;\n    }\n    this.bind();\n    this.size = data.length;\n    exports.gl.bufferData(this.type, data, hint || exports.gl.DYNAMIC_DRAW);\n  }\n  , resize: function(size, hint) {\n    if(this.deleted) {\n      return;\n    }\n    this.bind();\n    this.size = size;\n    exports.gl.bufferData(this.type, size, hint || exports.gl.DYNAMIC_DRAW);\n  }\n  , write: function(start, data) {\n    if(this.deleted) {\n      return;\n    }\n    this.bind();\n    exports.gl.bufferSubData(this.type, start, data);\n  }\n  , destroy: function() {\n    if(this.deleted) {\n      return;\n    }\n    exports.gl.deleteBuffer(this.buffer);\n    this.deleted = true;\n  }\n};\nexports.VertexBuffer = VertexBuffer;\n\n\n//------------------------------------------------------------------\n// Shaders\n//------------------------------------------------------------------\n//Creates shader object\nfunction createShaderObject (src, type) {\n  var gl = exports.gl\n    , shader = gl.createShader (type);\n  gl.shaderSource (shader, src);\n  gl.compileShader (shader);\n  if (!gl.getShaderParameter (shader, gl.COMPILE_STATUS)) {\n    throw new Error((type == gl.VERTEX_SHADER ? \"VERTEX\" : \"FRAGMENT\") + \" SHADER:\\n\" + gl.getShaderInfoLog (shader));\n  }\n  return shader;\n}\n//Uniform and attribute parser\nvar simpleTypes = {\n    \"float\":    \"1f\"\n  , \"bool\":     \"1i\"\n  , \"int\":      \"1i\"\n  , \"uint\":     \"1i\"\n  , \"vec2\":     \"2fv\"\n  , \"vec3\":     \"3fv\"\n  , \"vec4\":     \"4fv\"\n  , \"ivec2\":    \"2iv\"\n  , \"ivec3\":    \"3iv\"\n  , \"ivec4\":    \"4iv\"\n  , \"uvec2\":    \"2fv\"\n  , \"uvec3\":    \"3fv\"\n  , \"uvec4\":    \"4fv\"\n  , \"bvec2\":    \"2iv\"\n  , \"bvec3\":    \"3iv\"\n  , \"bvec4\":    \"4iv\"\n};\nvar matrixTypes = {\n    \"mat2\":     2\n  , \"mat3\":     3\n  , \"mat4\":     4\n};\nvar samplerTypes = {\n    \"sampler2D\":    \"2D\"\n  , \"samplerCube\":  \"Cube\"\n};\nfunction getParams(src, uniforms, attributes) {\n  var reg = /(uniform|attribute)\\s+(bool|u?int|float|[biu]?vec[234]|mat[234]|sampler2D|samplerCube)\\s+(\\w+)\\s*;/gm;\n  reg.compile();\n  for(var tmp = reg.exec(src); !!tmp; tmp = reg.exec(src)) {\n    if(tmp[1] == \"uniform\") {\n      uniforms[tmp[3]] = tmp[2];\n    } else {\n      attributes[tmp[3]] = tmp[2];\n    }\n  }\n}\nfunction addUniform(container, program, uniform, type) {\n  var gl = exports.gl\n    , location = gl.getUniformLocation(program, uniform);\n  if(!location) {\n    console.warn(\"Unused uniform: \", uniform, type);\n    container[uniform] = null;\n    return;\n  }\n  container.__defineGetter__(uniform, function() {\n    return gl.getUniform(program, location);\n  }); \n  if(type in simpleTypes) {  \n    container.__defineSetter__(uniform, eval([\n        \"function(value) {\"\n      , \"gl.uniform\" + simpleTypes[type] + \"(location, value);\"\n      , \"return value;\"\n      , \"}\"].join('\\n')));\n  } else if(type in matrixTypes) {\n    container.__defineSetter__(uniform, eval([\n        \"function(value) {\"\n      , \"gl.uniformMatrix\" + matrixTypes[type] + \"(location, false, value);\"\n      , \"return value;\"\n      , \"}\"].join('\\n')));\n  } else if(type in samplerTypes) {\n    container.__defineSetter__(uniform, function(value) {\n      gl.uniform1i(program, value);\n      return value;\n    });\n  } else {\n    throw new Error(\"Invalid type for uniform\");\n  }\n}\nfunction addAttribute(container, program, attribute, type) {\n  var gl = exports.gl\n    , location = gl.getAttribLocation(program, attribute);\n  container[attribute + \"_location\"] = location;\n  if(location < 0) {\n    console.warn(\"Unused attribute location\");\n    container[attribute] = null;\n    return;\n  }\n  if(!(type in simpleTypes)) {\n    throw new Error(\"Invalid attribute type: \" + attribute + \", \" + type);\n  }\n  container.attributes[location] = true;\n  container.__defineSetter__(attribute, eval([\n    \"function(value) {\"\n    , \"gl.vertexAttrib\" + type + \"(\" + location + \", value);\"\n    , \"return value;\"\n    , \"}\"].join('\\n')));\n  var ele_size = parseInt(type.charAt(0));    \n  container[attribute + \"_bind\"] = function(args) {\n    args.buffer.bind();\n    gl.vertexAttribPointer(\n        location\n      , ele_size\n      , args.type || gl.FLOAT\n      , args.stride || 0\n      , args.offset || 0);\n  };\n}\nfunction Shader(vertex_shader, fragment_shader) {\n  //First compile program\n  var gl = exports.gl\n    , program = gl.createProgram()\n    , vs = createShaderObject(vertex, gl.VERTEX_SHADER)\n    , fs = createShaderObject(fragment, gl.FRAGMENT_SHADER);\n  gl.attachShader (program, vs);\n  gl.attachShader (program, fs);\n  gl.linkProgram (program);\n  if (!gl.getProgramParameter (program, gl.LINK_STATUS)) {\n    throw new Error([\n        \"Error creating shader:\"\n      , \"--- Validate status: ---\" \n      , gl.getProgramParameter (program, gl.VALIDATE_STATUS)\n      , \"--- GL Error: ---\"\n      , gl.getError ()\n      , \"--- Vertex Shader ---\"\n      , vertex\n      , \"--- Fragment Shader ---\"\n      , fragment].join('\\n'));\n  }\n  gl.deleteShader (vs);\n  gl.deleteShader (fs);\n  \n  //Set members\n  this.program = program;\n  this.deleted = false;\n  this.attributes = new Array(current_attributes.length);\n  for(var i=0; i<current_attributes.length; ++i) {\n    this.attributes[i] = false;\n  }\n  \n  //Add uniform and attribute accessor methods\n  var uniforms    = {}\n    , attributes  = {};\n  getParams(vertex_shader,    uniforms, attributes);\n  getParams(fragment_shader,  uniforms, attributes);\n  for(var p in uniforms) {\n    addUniform(this, program, p, uniforms[p]);\n  }\n  for(var p in attributes) {\n    addAttribute(this, program p, attributes[p]);\n  }\n  \n  exports.emit(\"shader\", this);\n}\nShader.prototype = {\n  bind: function() {\n    if(this.deleted || current_shader === this) {\n      return;\n    }\n    exports.gl.useProgram(this);\n    for(var i=0; i<current_attributes.length; ++i) {\n      if(current_attributes[i] === this.attributes[i]) {\n        continue;\n      } else if(this.attributes[i]) {\n        exports.gl.enableVertexAttribArray(this.attributes[i]);\n      } else {\n        exports.gl.enableVertexAttribArray(this.attributes[i]);\n      }\n      current_attributes[i] = this.attributes[i];\n    }\n    current_shader = this;\n  }\n  , destroy: function() {\n    if(this.deleted) {\n      return;\n    }\n    if(current_shader === this) {\n      current_shader = null;\n    }\n    exports.gl.deleteProgram(this.program);\n    this.deleted = true;\n  }\n};\nexports.Shader = Shader;\n\n\n\n//------------------------------------------------------------------\n// Basic Initialization\n//------------------------------------------------------------------\nfunction check_error() {\n  var code = exports.gl.getError();\n  if(code === exports.gl.NO_ERROR) {\n    return;\n  }\n  throw new Error(\"WebGL Error.  Code = \", code);\n}\n\nvar canvas = null;\nfunction onWindowResize (event) {\n  canvas.width = window.innerWidth;\n  canvas.height = window.innerHeight;\n  exports.gl.viewport (0, 0, canvas.width, canvas.height);\n  exports.width   = canvas.width;\n  exports.height  = canvas.height;\n  exports.emit(\"resize\", canvas.width, canvas.height);\n  check_error();\n}\n\nvar nextFrame = window.webkitRequestAnimationFrame\n  || window.mozRequestAnimationFrame\n  || window.oRequestAnimationFrame\n  || window.msRequestAnimationFrame\n  || function(callback, element) {\n      window.setTimeout(callback, 1000 / 60);\n  };\n  \nexports.init = function() {\n  canvas = params.canvas_element;\n  exports.gl = canvas.getContext ('experimental-webgl');\n  \n  var n_attribs = exports.gl.getParameter(exports.gl.MAX_VERTEX_ATTRIBS);\n  current_attributes = [];\n  for(var i=0; i<n_attribs; ++i) {\n    current_attributes.push(false);\n  }\n  \n  onWindowResize ();\n  window.addEventListener ('resize', onWindowResize, false);\n  \n  exports.emit(\"init\");\n  check_error();\n  \n  nextFrame(animate);\n}\n\nfunction animate () {\n  nextFrame(animate);\n  exports.emit(\"draw\");\n  check_error();\n}\n\n"
  },
  {
    "path": "Terrain/require.js",
    "content": "// Browser-require\n//  https://github.com/rsms/browser-require\n\n// CommonJS compatible module loading.\n// (Except from require.paths, it's compliant with spec 1.1.1.)\n(function(parentExports){\n  // normalize an array of path components\n  function normalizeArray (v, keepBlanks) {\n    var L = v.length, dst = new Array(L), dsti = 0,\n        i = 0, part, negatives = 0,\n        isRelative = (L && v[0] !== '');\n    for (; i<L; ++i) {\n      part = v[i];\n      if (part === '..') {\n        if (dsti > 1) {\n          --dsti;\n        } else if (isRelative) {\n          ++negatives;\n        } else {\n          dst[0] = '';\n        }\n      } else if (part !== '.' && (dsti === 0 || keepBlanks || part !== '')) {\n        dst[dsti++] = part;\n      }\n    }\n    if (negatives) {\n      dst[--negatives] = dst[dsti-1];\n      dsti = negatives + 1;\n      while (negatives--) { dst[negatives] = '..'; }\n    }\n    dst.length = dsti;\n    return dst;\n  }\n  // normalize an id\n  function normalizeId(id, parentId) {\n    id = id.replace(/\\/+$/g, '');\n    return normalizeArray((parentId ? parentId + '/../' + id : id).split('/'))\n           .join('/');\n  }\n  // normalize a url\n  function normalizeUrl(url, baseLocation) {\n    if (!(/^\\w+:/).test(url)) {\n      var u = baseLocation.protocol+'//'+baseLocation.hostname;\n      if (baseLocation.port && baseLocation.port !== 80) {\n        u += ':'+baseLocation.port;\n      }\n      var path = baseLocation.pathname;\n      if (url.charAt(0) === '/') {\n        url = u + normalizeArray(url.split('/')).join('/');\n      } else {\n        path += ((path.charAt(path.length-1) === '/') ? '' : '/../') + url;\n        url = u + normalizeArray(path.split('/')).join('/');\n      }\n    }\n    return url;\n  }\n  // define a constant (read-only) value property\n  var defineConstant;\n  if (Object.defineProperty) {\n    defineConstant = function (obj, name, value) {\n      Object.defineProperty(obj, name, {value: value, writable: false,\n        enumerable: true, configurable: false});\n    }\n  } else {\n    defineConstant = function (obj, name, value) { obj[name] = value; }\n  }\n  // require/load/import a module\n  // require(id[, parentId]) -> [object module-api]\n  // @throws Error /module not found (json-rep-of-id)/\n  function require (id, parentId) {\n    var originalInputId = id; // for \"not found\" error message\n    if (id.charAt(0) === '.') {\n      id = normalizeId(id, parentId);\n    }\n    if (!require.modules.hasOwnProperty(id)) {\n      throw new Error('module not found '+JSON.stringify(originalInputId));\n    }\n    var mod = require.modules[id];\n    if (mod.exports === undefined) {\n      var _require = function (_id) {\n        //console.log('_require', _id, 'from', id);\n        return require(_id, id);\n      };\n      defineConstant(_require, 'main', require.main);\n      var block = mod.block; delete mod.block;\n      mod.exports = {};\n      if (require.initFilter) {\n        block = require.initFilter(block);\n      }\n      block(_require, mod, mod.exports);\n    }\n    return mod.exports;\n  }\n  // define a module\n  // define(String id, [String uri,] block(require, module, exports){...})\n  function define (id, uri, block) {\n    if (typeof uri === 'function') {\n      block = uri; uri = null;\n    }\n    var mod = {block: block};\n    defineConstant(mod, 'id', String(id));\n    if (uri) {\n      defineConstant(mod, 'uri', String(uri));\n    }\n    require.modules[mod.id] = mod;\n    return mod;\n  }\n  // modules keyed by id\n  require.modules = {};\n  // search paths -- disabled until we use/need this\n  //require.paths = [];\n  // main module, accessible from require.main\n  var mainModule = define('');\n  delete mainModule.block;\n  mainModule.exports = parentExports;\n  defineConstant(require, 'main', mainModule);\n  // the define function\n  require.define = define;\n  // export the require function\n  parentExports.require = require;\n\n  // -------------------------------------------------------\n  // Optional require.load\n  if (typeof XMLHttpRequest === \"undefined\") {\n    // we make use of XHR\n    XMLHttpRequest = function () {\n      try { return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\"); } catch (e) {}\n      try { return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\"); } catch (e) {}\n      try { return new ActiveXObject(\"Msxml2.XMLHTTP\"); } catch (e) {}\n      throw new Error(\"This browser does not support XMLHttpRequest.\");\n    };\n  }\n  /**\n   * Load and define a module\n   * load ( spec Object, Function(callback(err Error)) )\n   * load ( specs Array, Function(callback(err Error)) )\n   * load ( url String, Function(callback(err Error)) )\n   */\n  function load (spec, callback) {\n    if ((spec instanceof Array) ||\n        Object.prototype.toString.call(spec) === \"[object Array]\") {\n      if (callback) {\n        // load multiple and join on callback\n        var countdown = spec.length;\n        for (var i=0;i<spec.length;++i) {(function(u){\n          load(u, function (err) {\n            if (err) {\n              countdown = 0;\n              //throw err;\n              callback(err);\n            } else if (--countdown === 0) {\n              callback();\n            }\n          });\n        })(spec[i]);}\n      } else {\n        // load multiple (blocking) -- don't use this for network resources\n        for (var i=0;i<spec.length;++i) {\n          load(spec[i]);\n        }\n      }\n      return;\n    } else if (typeof spec === 'string') {\n      spec = {url:spec};\n    }\n    if (!spec.url && spec.id) {\n      spec.url = spec.id + '.js';\n    } else if (spec.url && !spec.id) {\n      var m = /^[^\\/]+\\/\\/[^\\/]+\\/(.+)$/.exec(spec.url);\n      if (m) {\n        spec.id = m[1];\n      } else {\n        spec.id = spec.url;\n      }\n      spec.id = spec.id.replace(/\\.[^\\.]+$/, '');\n    } else if (!spec.url && !spec.id) {\n      throw new TypeError('missing both \"url\" and \"id\"');\n    }\n    // normalize url\n    spec.url = normalizeUrl(spec.url, window.location);\n    var xhr = new XMLHttpRequest();\n    var async = !!callback;\n    function evalResponse() {\n      try {\n        eval('require.define(\"'+spec.id+'\",'+\n             ' \"'+spec.url.replace(/\"/g, '\\\\\"')+'\"'+\n             ', function (require, module, exports) {'+xhr.responseText+'});');\n      } catch (err) {\n        err.message += ' in '+spec.url;\n        throw err;\n      }\n    }\n    xhr.open('GET', spec.url, async);\n    if (async) {\n      xhr.onreadystatechange = function (ev) {  \n        if (xhr.readyState == 4) {\n          if ((xhr.status < 300 && xhr.status >= 200)\n            || (xhr.status === 0 && !spec.url.match(/^(?:https?|ftp):\\/\\//i))) {\n            try {\n              evalResponse();\n              callback(null);\n            } catch (err) {\n              callback(err);\n            }\n          } else {\n            callback(new Error('failed to load remote module with HTTP'+\n                               ' response status '+xhr.status+' '+\n                               xhr.responseText));\n          }\n        }\n      };\n    }\n    xhr.send(null);\n    if (!async) {\n      evalResponse();\n    }\n  }\n  require.load = load;\n\n})(this);\n"
  },
  {
    "path": "resume.html",
    "content": "<html>\n  <head>\n    <title> Online Resume </title>\n  </head>\n  <body>\n\n    <h1>Mikola Lysenko's Resume</h1>\n\n    <h2>Contact Info:</h2>\n    <ul>\n      <li>Email: mikolalysenko -at- gmail.com</li>\n      <li>Homepage: <a href=\"http://0fps.net\">http://0fps.net</a> </li>\n      <li>GitHub: <a href=\"http://github.com/mikolalysenko\">@mikolalysenko</a></li>\n      <li>Twitter: <a href=\"http://twitter.com/mikolalysenko\">@mikolalysenko</a></li>\n    </ul>\n\n    <h2>Selected projects</h2>\n    <ul>\n      <li><a href=\"http://stack.gl\">stack.gl</a>: A modular ecosystem for WebGL</li>\n      <li><a href=\"http://scijs.net/packages\">scijs</a>: A scientific computing environment for JavaScript</li>\n      <li><a href=\"http://github.com/gl-vis/gl-plot3d\">gl-vis</a>: Modules for data visualization using WebGL</li>\n      <li><a href=\"http://voxeljs.com/\">voxel.js</a>: Voxel engine in JavaScript</a>\n      <li><a href=\"https://github.com/mikolalysenko/box-intersect\">box-intersect</a>: A fast library for any dimensional box intersection</li>\n      <li><a href=\"https://github.com/mikolalysenko/l1-path-finder\">l1-path-finder</a>: A library for path finding in any dimension</li>\n      <li><a href=\"https://github.com/mikolalysenko/orthogami\">orthogami</a>: Orthogami unfolding for polycubes</li>\n    </ul>\n\n    <h2>Papers:</h2>\n    <ul>\n      <li> M. Lysenko, V. Shapiro. (2015) \"Effective Contact Measures\" SIAM Symposium on Solid Physical Modeling.</li>\n      <li> J. van de Gronde, M. Lysenko, J. Roerdink. (2014) \"Path-based mathematical morphology on tensor fields\", Visualization and Processing of Higher Order Descriptors for Multi-Valued Data.</li>\n      <li> M. Lysenko. (2013) \"Fourier Collision Detection\", International Journal of Robotics Research.</li>\n      <li> B. McCarthy, M. Lysenko, V. Shapiro. (2012) \"Configuration Workspaces of Series-Parallel Mechanisms\".  ASME 2012 International Design and Engineering Technical Conference, IDETC/CIE 2012 Chicago IL</li>\n      <li> M. Lysenko, (2011) \"Fourier Collision Detection\" Technical Report.  University of Wisconsin-Madison </li>\n      <li> S. Nelaturi, M. Lysenko, V. Shapiro (2011) \"Rapid Mapping and Exploration of Configuration Space\", ASME 2011 International Design and Engineering Technical Conference, IDETC/CIE 2011 Washington DC </li>\n      <li> M. Lysenko, S. Nelaturi, V. Shapiro (2011) \"Non-commutative Morphology: Shapes, Filters and Convolutions\" Computer Aided Geometric Design.\n      <li> M. Lysenko, S. Nelaturi, V. Shapiro (2010) \"Group Morphology With Convolution Algebras\" ACM Symposium on Solid Modeling. Haifa, Israel</li>\n      <li> R. D'Souza, M. Lysenko, S. Marion, D. Kirschner (2009) \"Data Parallel Algorithms for Agent-Based Model Simulation of Tuberculosis on Graphics Processing Units\", Spring Simulation Conference </li>\n      <li> M. Lysenko, R. D'Souza (2009) \"Interactive Machinability Analysis for Free-Form Surfaces Using Multiple View Image Space Techniques on the GPU\" Journal of Robotics and Computers in Integrated Manufacturing. </li>\n      <li> M. Lysenko, K. Rahmani, R. D'Souza (2008) \"Real Time Machinability Analysis of Free Form Surfaces on the GPU\" Journal of Computers and Information Science in Engineering </li>\n      <li> M. Lysenko, R. D'Souza, C.K. Shene (2008) \"Improved Binary Space Partition Merging\", Computer Aided Design. </li>\n      <li> M. Lysenko, R. D'Souza (2008) \"A Framework for Megascale Agent Based Modeling on the GPU\", Journal of Artificial Societies and Simulations </li>\n      <li> R. Richards, M. Lysenko, G. An, R. D'Souza (2008) \"Data-Parallel Techniques for Agent Based Tissue Modeling on Graphics Processing Units\", ASME IDETC 2008, New York, NY </li>\n      <li> R. D'Souza, M. Lysenko, K. Rahmani (2007) \"SugarScape on Steroids: Simulating over One Million Agents at Interactive Rates\" Proceedings of Agent2007 conference. Chicago, IL </li>\n      <li> M. Lysenko, K. Rahmani, R. D'Souza (2007) \"Real Time Machinability Analysis of Free Form Surfaces on the GPU\" ASME 2007 International Design and Engineering Technical Conference, IDETC/CIE 2007 </li>\n    </ul>\n\n    <h2>Selected Talks:</h2>\n    <ul>\n      <li> <a href=\"https://www.youtube.com/watch?v=YD7iqHJ0NUI&index=14&list=PLPhU2Tz1TddCis5MZlx1HQeK5GYJoIbu8\">Relativistic replication.</a> NodeConfEU, Waterford Ireland. 2014 <a href=\"https://github.com/mikolalysenko/nodeconfeu2014-slides\">Slides</a> < </li>\n      <li> <a href=\"https://vimeo.com/98418285\">Modular multidimensional arrays for JavaScript.</a> Web Rebels, Oslo Norway. 2014 <a href=\"http://mikolalysenko.github.io/ndarray-presentation/\">Slides</a> <aVideo </li>\n      <li> Berlin Mathematical Society Seminar. 2012 </li>\n      <li> Cambridge University, United Kingdom. 2012 </li>\n      <li> University of Groningen, Netherlands. 2012 </li>\n      <li> RWTH Aachen, Germany. 2012 </li>\n      <li> Institute of Science and Technology, Austria. 2012 </li>\n      <li> Freie Universitat Berlin, Germany. 2012 </li>\n      <li> \"Piecewise affine function\" ACM Symposium on Solid and Physical Modeling 2009 </li>\n      <li> \"Tolerant Modeling\" (joint work with Prem Mansukhani and Vadim Shapiro), ACM Symposium on Solid and Physical Modeling 2009</li>\n      <li> \"Get some fibers in your diet!\" D Tango Conference. Torun, Poland. 2008 </li>\n      <li> U.C. Berkeley, California. 2007 </li>\n      <li> \"Realtime Constructive Solid Geometry\", SIGGRAPH 2007 </li>\n    </ul>\n\n    <h2>Teaching:</h2>\n    <ul>\n      <li> CS 558, Introduction to Computational Geometry (Fall 2014).  YouTube lectures </li>\n      <li> <a href=\"https://github.com/stackgl/webgl-workshop\">WebGL workshop</a>, CampJS 2014. </li>\n      <li> <a href=\"https://github.com/stackgl/shader-school\">ShaderSchool</a>, NodeConf 2014. </li>\n      <li> CS 558, Introduction to Computational Geometry (Spring 2011) </li>\n      <li> ME 331, Solid Modeling (Fall 2012) </li>\n      <li> CS 558, Introduction to Computational Geometry (Fall 2013) </li>\n    </ul>\n\n    <h2>Awards and Other Activities:</h2>\n    <ul>\n      <li> CRA Outstanding Undergraduate Research Award (Honorable Mention) 2007 </li>\n      <li> Twice ACM ICPC World Finalist, 2007 and 2008 </li>\n      <li> Assistant coach for UW Madison ICPC Team, 2009 </li>\n      <li> <a href=https://npmjs.org/~mikolalysenko>Author on over 500 modules on npm</a> </li>\n      <li> Blog: <a href=\"http://0fps.wordpress.com\">http://0fps.wordpress.com</a> </li>\n      <li> Github: <a href=http://github.com/mikolalysenko>@mikolalysenko</a>. </li>\n      <li> StackOverflow <a href=http://stackoverflow.com/users/293627/mikola>@mikola</a>. </li>\n      <li> One of my <a href=http://www.sciencedaily.com/releases/2008/09/080916155058.htm>undergrad research projects made the news.</a> </li>\n      <li> <a href=http://dlang.org/phobos/core_thread.html>I added Fibers to D!</a> </li>\n      <li> I visited Berlin for the summer of 2012 </li>\n    </ul>\n\n    <h2>Education:</h2>\n    <ul>\n      <li>PhD Computer Science/Mechanical Engineering.  University of Wisconsin-Madison.  ABD </li>\n      <li>Bachelors of Computer Science. Michigan Technological University. 2003-2008 </li>\n    </ul>\n\n    <h2>Work History:</h2>\n    <ul>\n      <li>plot.ly.  Consultant.  2013-present</li>\n      <li>3D Systems. Consultant.  2012-2014.</li>\n      <li>Research Assistant.  University of Wisconsin-Madison, Department of Mechanical Engineering. Advisor: Vadim Shapiro. 2009-2014. </li>\n      <li>Research Assistant.  Michigan Technological University, Department of Mechanical Engineering.  Advisor: Roshan D'Souza.  2006-2008. </li>\n      <li>Oracle DB/Web Programmer. Michigan Technological University, Administrative Department. 2005-2006</li>\n      <li>Programmer.  Michigan Molecular Institute. Midland, MI.  2001-2004</li>\n    </ul>\n\n    <h2>Buzzwords/Skills:</h2>\n    <ul>\n      <li> Languages: C, C++, Python, Java, JavaScript, SML, Lisp, Scheme, VisualBasic, QBasic, MATLAB, Erlang ... </li>\n      <li> Systems (in order of familiarity): Linux, Solaris, OS X, Windows </li>\n      <li> Technologies: HTML5, WebGL, Three.JS, CSS, OpenGL, CUDA, GLSL, HLSL, DirectX, SDL, MongoDB, node.js, redis, CouchDB, Intel TBB, BLAS, MKL, scipy, browserify, npm ... </li>\n    </ul>\n\n  </body>\n</html>\n"
  }
]